【问题标题】:Is it possible to read a Video from POST request into python-ffmpeg or OpenCV?是否可以将 POST 请求中的视频读入 python-ffmpeg 或 OpenCV?
【发布时间】:2021-01-15 10:43:23
【问题描述】:

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

提前致谢。

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

【问题讨论】:

    标签: python opencv ffmpeg pyffmpeg


    【解决方案1】:

    收到视频后,您可以像处理硬盘中的任何其他视频一样对其进行处理。注意视频的格式。我在这个例子中使用了 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(或您的充当服务器的脚本)不知道在 POST REQUEST 期间从HTML FORMCLIENT。但是 SERVER 可以 了解文件大小的三件事视频文件的字节数。

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

    第一件事是:要求输入视频文件的大小(BAD IDEA),让用户充满信心。

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

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

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

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

    http post 请求是如何发生的

    HTML FORM 发送数据 时,BROWSER 发出 POST REQUEST 向服务器发送一些信息,如下所示:

    这是 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 可以完全伪造。

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

    【讨论】:

    • 是的,我要将视频保存到硬盘中,然后在后台处理它。但是在这样做之前我应该​​考虑任何安全问题吗?甚至在处理和验证文件之前保存文件是否 100% 安全? (在保存之前将完成的唯一验证步骤是:验证大小,检查格式)。
    • 你是在使用 python 来接收来自 html 表单的 Post 数据,还是其他东西(apache web server ,其他一些 http server con altro linguaggio?)
    • 我从 HTML 表单获取 POST 数据,所以它来自客户端而不是另一个后端服务器。
    • 我认为要在接收到不必要的数据时关闭服务器连接,您必须使用套接字来计算 POST 期间收到的字节数。
    • 假设你想用一个最小的 Python Socket Server 接收 POST 数据,你需要了解的是 Python Socket 编程和 HTTP 协议。否则,使用 Http 服务器并使用配置文件并限制它在 POST 期间可以接收的最大字节数。安全概念是另一回事。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多