0

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

提前致谢。

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

4

1 回答 1

0

收到视频后,您可以像处理硬盘中的任何其他视频一样对其进行处理。注意视频的格式。我在这个例子中使用 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 web 应用框架: https ://flask.palletsprojects.com/en/1.1.x/

这里是文件上传配置和安全问题: https ://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/

限制视频文件的文件大小

SERVER(或充当服务器的脚本)不知道在HTML FORMCLIENTPOST REQUEST期间接收的视频文件的长度(小时:分钟:秒) 。但是服务器可以做 三件事来了解视频文件的文件大小(以字节为单位)。

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

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

第二种是:读取HTTP POST REQUESTHEADERcontent-length:value ”(这个值也可以被用户伪造)。

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

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

所以自己编写脚本(SOCKET PROGRAMMING)或配置一个现有的HTTP 服务器WEB 框架来为你做这件事(我把链接放到 Flask)。

http post 请求是如何发生的

HTML FORM 发送数据时,浏览器发出一个 POST 请求,向服务器发送一些信息,如下所示:

这是POST REQUEST的 HTTP HEADER 示例

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

内容长度:99211703

... 99MB 之类的...

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

所有这些东西都是SOCKET PROGRAMMING

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

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

更好的安全性读取正在上传的文件头的内容,因为 HTTP POST HEADER 可能完全是 FALSIFIED 。

这里是 mp4 文件格式的示例: https ://www.file-recovery.com/mp4-signature-format.htm

于 2021-01-15T15:42:11.187 回答