首页 > 解决方案 > 当我尝试使用 ffmpeg 和烧瓶寻找流时出错

问题描述

我想从谷歌驱动器文件中获取可搜索的流,但是当调用 127.0.0.1:500/ 时,它可以工作并返回视频流,但它没有显示视频的持续时间,也不允许我前进或倒退它

vlc中流的img

我还使用 html 播放器进行了测试,它给了我一个内容长度错误,似乎 8 秒后它开始上传文件的持续时间长达 10 秒(文件的总持续时间为 10 秒)

播放器网络中流的 img

import threading
from flask import Flask, request
from flask.helpers import stream_with_context
import requests
import subprocess
from requests import Response

from flask import request, make_response, Response, stream_with_context, send_file



app = Flask(__name__)

@app.route('/<id>')
def index(id):
   
    range = request.headers.get('Range')
   
    
    token = "ya29.a0ARrdaM8vW_pKmGhIRleJiZ9fuoprk2-zS0bgJPaslD3V4idJ6wK52_iwJE8MOYnj7kCOWl5m2oHlEWc3LEWcPt5-b4nemoC7SKy7l-4QO1DviJnPBfVeHruAU27I_UE3gMPRV4H-Tk1ZLrNp56UfxyR-ObAx"

    headers = {
        "Authorization":"Bearer "+token
    }
    if (range != None):
        headers = {
            "Authorization": "Bearer " + token,
            "Range":range
        }

    url = "https://www.googleapis.com/drive/v3/files/"+id+"?alt=media"
    r = requests.get(url, headers=headers, stream=True)
    
    
    def getVideoStreaming():
        for chunck in r.iter_content(1024):
            if chunck:
                process.stdin.write(chunck)
        process.stdin.close()

    thread = threading.Thread(target=getVideoStreaming)
    


    command = ("ffmpeg","-i", "-","-y","-vcodec","copy","-movflags", "frag_keyframe+empty_moov","-f","mp4","pipe:1")
    process = subprocess.Popen(command,shell=True,stdout = subprocess.PIPE,stdin=subprocess.PIPE)

    thread.start()
    
  
    def readingFfmpeg():
        
        for data in iter(process.stdout.readline, b''):
            if not data:
                break
            yield data
        
      
    
    response =  Response(stream_with_context(readingFfmpeg()),mimetype=r.headers.get('Content-Type'))
    
    response.headers.set('Content-Range',r.headers.get('Content-Range'))
    response.headers.set('Cache-Control', r.headers.get('Cache-Control'))
    response.headers.set('Content-Length', r.headers.get('Content-Length'))
    
    
  
    if(range != None):
        return response,200
    else:
        return response,206
    

标签: pythonflaskffmpegstreamingdrive

解决方案


推荐阅读