是否可以将来自 POST 请求的视频读入 python-ffmpeg 或 OpenCV?

Is it possible to read a Video from POST request into python-ffmpeg or OpenCV?

我一直在想办法用ffmpeg-python或OpenCV从POST请求中读取上传的视频,这样我就可以在保存之前处理它,所以有可能吗? 如果不是,那么将视频保存到磁盘然后进行所有需要的处理是否安全?困扰我的要点是我想阅读视频长度,以便我可以验证它是否有效,所以将它保存到磁盘中也是一个好主意,检查长度,然后如果它的长度在允许的范围内则保留它范围,否则我将其删除。

提前致谢。

注意:我注意到标签不包含 ffmpeg-python,因此关于 pyffmpeg 的答案也被接受。

收到视频后,您可以像处理硬盘中的任何其他视频一样处理它。注意视频的格式。我在这个例子中使用了 video.mp4。

import cv2
video_path="videos/drone-001.mp4"

cap = cv2.VideoCapture(video_path)

# Some characteristics from the original video
w_frame, h_frame = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps, num_frames = cap.get(cv2.CAP_PROP_FPS), cap.get(cv2.CAP_PROP_FRAME_COUNT)

print(fps,num_frames,w_frame,h_frame)

while(True):

    success, frame = cap.read()
    
    if success:
        cv2.imshow('video',frame)
    
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

# When everything done, release the capture and destroy windows
cap.release()
cv2.destroyAllWindows()

或者用ffmpeg处理视频...

获取有关视频的信息:

ffmpeg -i videos/drone-001.mp4

输出:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'videos/drone-001.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2019-12-28T10:01:05.000000Z
  Duration: 00:05:41.38, start: 0.000000, bitrate: 2324 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 2192 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2019-12-28T10:01:05.000000Z
      handler_name    : ISO Media file produced by Google Inc. Created on: 12/28/2019.
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2019-12-28T10:01:05.000000Z
      handler_name    : ISO Media file produced by Google Inc. Created on: 12/28/2019.

你可以看看 Flask , WSGI 网络应用框架: https://flask.palletsprojects.com/en/1.1.x/

此处用于文件上传配置和安全问题: https://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/

限制视频文件的文件大小

SERVER(或您的脚本充当服务器)不知道在 期间接收的视频文件 (hours:minutes:seconds) 的长度POST REQUEST 来自 CLIENT 通过 HTML FORM。但是SERVER可以做到 关于视频文件.

的文件大小的三件事

第一个和第二个很容易破解,因为可以伪造。第三个是不可破解

第一件事是:通过要求输入视频文件的大小来给用户充分的信心(BAD IDEA) .

第二个是:读取HEADERHTTP POST REQUEST "content-length: value" (这个值也可以被用户伪造).

第三个是:读取并计算服务器正在接收的字节数。

如果您的字节数开始变得太高,最好选择关闭连接。

所以自己编写脚本 (套接字编程) 或配置现有的 HTTP 服务器WEB FRAMEWORK 为您完成(我将 link 放入 Flask)。

http post 请求是如何发生的

HTML FORM 发送数据 时,BROWSER 发出POST REQUEST 向服务器发送一些信息像这样:

这是 HTTP HEADER 的 POST REQUEST

示例
POST /video-upload/ HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------219493771727403213993181042749
Content-Length: 99211703
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Content-Length:99211703

...类似99MB ...

如果 content-length 的值太高,您可以从服务器端中止连接否则继续读取并保存数据到服务器硬盘

所有这些都是套接字编程

您可以在这里品尝https://realpython.com/python-sockets/

确保无法执行上传文件 上传时重命名文件 验证 Content-Type Header 使用病毒扫描程序

更安全 阅读文件 header 的内容 正在上传,因为 HTTP POST HEADER 可能完全被篡改。

这里有一个 mp4 文件格式的例子: https://www.file-recovery.com/mp4-signature-format.htm