Python和FFMPEG视频流不通过HTML5显示

Python和FFMPEG视频流不通过HTML5显示,python,sockets,ffmpeg,html5-video,chunking,Python,Sockets,Ffmpeg,Html5 Video,Chunking,我试图编写一个python脚本,通过HTTP为视频服务,并通过HTML5视频标记显示它,我使用FFMPEG通过HTTP为视频服务,并通过python中的套接字接收视频。FFMPEG似乎正在发送视频,而我的Python脚本正在接收视频,但由于某些原因,我无法在web浏览器中显示视频,也无法在脚本中看到任何可见错误 我们将非常感谢您的帮助 这是我用来将视频发送到HTTP的FFMPEG线路 FFMPEG -re -i video_file.webm -c:v libx264 -c:a copy -f

我试图编写一个python脚本,通过HTTP为视频服务,并通过HTML5视频标记显示它,我使用FFMPEG通过HTTP为视频服务,并通过python中的套接字接收视频。FFMPEG似乎正在发送视频,而我的Python脚本正在接收视频,但由于某些原因,我无法在web浏览器中显示视频,也无法在脚本中看到任何可见错误

我们将非常感谢您的帮助

这是我用来将视频发送到HTTP的FFMPEG线路

FFMPEG -re -i video_file.webm -c:v libx264 -c:a copy -f h264 http://127.0.0.1:8081
这是我的Python代码

import socket   #for sockets handling
import time     #for time functions
import sys

hostIP = '127.0.0.1'
SourcePort = 8081 #FFMPEG
PlayerPort = 8082 #Internet Browser

def gen_headers():
     # determine response code
     h = ''
     h = 'HTTP/1.1 200 OK\n'
     # write further headers
     current_date = time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime())
     h += 'Date: ' + current_date +'\n'
     h += 'Content-Type: video/mp4\n\n'
     return h

def start_server():
    socketFFMPEG = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # this is for easy starting/killing the app
    socketFFMPEG.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    print('Socket created')

    try:
        socketFFMPEG.bind((hostIP, SourcePort))
        print('Socket bind complete')
    except socket.error as msg:
        print('Bind failed. Error : ' + str(sys.exc_info()))
        sys.exit()

    #Start listening on socketFFMPEG
    socketFFMPEG.listen(10)
    print('Socket now listening. Waiting for video source from FFMPEG on port', SourcePort)

    conn, addr = socketFFMPEG.accept()
    ip, port = str(addr[0]), str(addr[1])
    print('Accepting connection from ' + ip + ':' + port)

    socketPlayer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socketPlayer.bind((hostIP, PlayerPort))
    socketPlayer.listen(1) #listen just 1 petition
    print('Waiting for Internet Browser')
    conn2, addr2 = socketPlayer.accept()
    conn2.sendall(gen_headers().encode())

    while True:
        try :
            #receive data from client FFMPEG
            input_from_FFMPEG = conn.recv(1024) 
            #send data to internet browser
            conn2.sendall(input_from_FFMPEG)
        except socket.error:
            print('Error data :' + str(input_from_FFMPEG))
            print('send Error : ' + str(sys.exc_info()))
            conn2.close()
            sys.exit()

    socketFFMPEG.close()

start_server()  
加载以下“字节”类型的数据时,出现错误10053“主机中的软件中止了已建立的连接”

\x00\x00\x00\x01A\x9b\x1dI\xe1\x0f&S\x02\xbf\xb1\x82j3{qz\x85\xca\\\xb2\xb7\xc5\xdfi\x92y\x0c{\xb0\xde\xd1\x96j\xccE\xa3G\x87\x84Z\x0191\xba\x8a3\x8e\xe2lfX\x82\xd4*N\x8a\x9f\xa9\xc9\xfb\x13\xfc_]D\x0f\x9e\x1c"\x0fN\xceu\t\x17n\xbe\x95\xd1\x10Wj\xf5t\x90\xa8\x1am\xf7!d\x82py\n\x10\xf5\x9b{\xd9\xf8\x8e^\xc7\xb3o+\x0eQX\xb3\x17B?\xb8\x1c\xecP\xa0\xf10\xc7\xc8\x8d\xf1P\xd3\xdf\xd0\xd5\x13ah+bM\x9c\xbe\xca\xb4\x9a?\xac\xb9\x0fao\xf3\xed\x9c\xe4^\x10\x079t\xf4\x0f\xce\xbe*\xd4w\x1f\x1a\x02\xbd\xed\xe9\x16\x8a\x98\xe0\x1d\xc4\xde5\xa8\xf0\x88\xb4\x07=\xe2w\xc3Q\xc1\x99K7\xff\x01`(\xb3sN\x88\x18\xfd7\xd4\x07\xab\x95\xf95\x05\xcd\xd6,!=\xfb\xc4\xc8\xbf\xad\x96\x83\xc0\x9b%\xdds\x92s\xc0lN\xdd\x14\xba\xbd\x04L\xb1\x08\xec[~tB~`\r\xbe\xa9\xbe\xa4r`\xa3\x98\x19z\xa9\xe9\xd3jK>(\xd5\x8c\x9eY~\xa8\x9f\x86\x90\x148R\xfd<\xb2\xdaUy\xa8\xb5\xba\x1d\xd1\xf6\xa6N\xb0#\x08Xo\xa6\x1c \xbaB\x8cbp\x1c\r\xa1\xa4"\x06\xd8\xe5\x85[\x89\x8a\xcba\xa3\xcc\xe0C\x946\xad6\x08\x90\r&\xcb\x13\xa6\xfbG\xc5\x85I<\x96\xcb\x89}\xcb\xda\xa5\x02\xbcB\xb9\x93\x938\x89\x1c\x92\xb3\x83\xfe\xa7\xf6\xa8\x1f\xdf\xa8\xef\xd55\xb6\xbf>#\xba\xd7\x8e\xd2z\xc2\xca\xf9\xdd2\xdd\x96\xb6\xf8\xc3\xc1\x0f/D\x05\xd3?\x18\xb1\x85T\x08\xcd\xfc\xc7p\xba\x0c\x93\xcdY\xf3 !4\x13\xaen\x82\x10[\x07I>\xe4\xc3\xb7\xca\xee\x93\r\xc3\xe1>\xe9\xd6\x9a\xbeLQ\x93\x86n\xadb\x13\xcas\xc0\xdeh\x1a\x9f\x00Dp\x94fv\xb7\xd9\xba\x93\x0c\xd1H2\x0e\xa2]`\xf2Q{+o\x80\xf0\x8a\x11"\x94u\x9b1\xc3\xdaV\xd9\x9e\xc6\xf7?\x18\xd9\xfbs\xf3\x07\xc6\x91\x83\x19\'\x13\xe4o\xa9S\x1cP\xa4w\xbc\xe36\xb9k\xc3\xaa":~`\xe7\x18\xe8\x9bu\n\x16\xf3\x89\xe2k\x07\x08\xf6\x8c\x98\x98\xbd\x8f*\x11\xe7\xa1\nj1\'\xe2=\x7f\xdf\x16\xc8\xf6\xec\xe1\xe6G\xd1\x1b\xeb\xc0\xd4\xf7\xc3c\xc7v\xc3\xf8\xa5\xac\x89\xdd4\x90i\t\x98\xfe\xfcx\xad{[\xf4\x92\x16^O\xf2\xc2]\xec\xa7\xe9Gu\\dF\xa6\xa7\xd3k?\xba\xedY\xba\x85\'\x1a\xa6.(\xcfB\x82tN\xdc\xad\xe6\xfcM\x01:\x0b\x14\x070\xf4\x99l2C\x92\x9c\x13h\x82\xf6w\xc4$5\xe1~\x11T~\xc9\x8f\xaeUAI%\xa6\x12(\x9c\x17\x9d*\xcc9\xee\xb7\xb8w \x92\x9a\x1cD\xfd\xd8wi7rt\xd8\x93\xbd7\x83\xf1\xe3\xbd\x92\x81\xe0\xfel\xfa\\\x9c\xebM\xf3m`p\xb9\xe2\x13Kd\xe08\xcc\x15\x96[G\xda`\x8cD\xa7\xf1\xd3\xc8T\xcf\xb1)\xa5E$\x91\x94{\x88&\xac\xc1\x92\xd5E\xa98\xd2\x89\xd1?\xd7\x9c\xdc\xbb!\x18\xc1\xa1m\xba*L\xab\xa0\xff\xd8\xee\xbbH\xe3\xa2\xe4\x9d=9\x05\xb4\x9bm\xe7\xc6J\xd9\xc3\xb1\xe9b*jB`4t\x9fv\xe8\xc4F\x9c`\xd0\x03\xd8\x12}\x8b\xb3$A\x9c\xdc;\x81@)rH\xf1\x18\xe1\xba\x0c4\x06\xe9xa\x94\xdd\xde\xa8&\xef)\xd7F\x94F\xa7j\xd3\x13O\xe03\xc9\xc9\xf2\x15\x1a\x9bsy\x16\x83H\xb4\x9e\xee\xc9M\xe7\xf4x \xa5\x9c^\xb9m\xeee\x03=_\x11\xda^l\xfe\xba\xa4\x98mjW\xf0\xa9\xc4\x11g\xd9C\xf7K.\x8c\xab3~n%\x7f\xc0p\xc8\xb1\xd6\x8d\xe5E\xb1\xc1\xe3(~\x9e\x9c\x91.\xdc\x08\xfb\xa0\xbe\x98y$U\xdeH\x08\xb2z,yX\xfaqx\xfe\xb0\xa9\xb4Q\xf2P\x95d\xc8\x88\r\xc3\x1dr\x88\xba\xc8\x990`(\x08m\x19\xebi\xf8\x11\xc6g\xd6\xc4\x12C\xad~\xe1$2\x01Hmg\xdb\x920\x18\xcc\xc0K\x04~\x1e\xeb\xd9>\x81F*I\x99\xe4\x00\xa3\xc4,U\x89\xdf\x843\xa3\xfb\xea\xc9d\x05\xeb]
[代码>\0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 xd1\x10Wj\xf5t\x90\xa8\x1am\xf7!D\x82py\N\x10\xf5\x9b3\X8\X8\0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0 \X8 8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\X8 8 \X8 8 8 8 \X8 0 0 0 0 0 0 0 0 0 \x10 10 10 10 10 \X7 \X7 7 7 \X8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \X7 \X8 \X8 \X8 \X8 8 8 \X8 8 8 8 8 8 8 8 8 \X8 8 8 8 8 \X8 8 8 8 \X8 8 8 8 8 8 8 \ \X8 8 8 8 8 \ \ \8\xf0\x88\xb4\x07=\xe2w\xc3Q\xc1\x99K7\xff\x01`(\xb3sN\x88\x18\xfd7\xd4\x07\xab\x95\xf95\x05\xcd\xd6,!=\xfb\xc4\xc8\xbf\xad\x96\x83\xc0\x9b%\xdds\x92s\xc0lN\xdd\x14\xba\xbd\x04L\xb1\xb1\x08\xec[~tB`\r\xbe\xb9\xbe\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\xAE\x89\x89\x89\xD9Z\xD9\xD9\xD9\xD8xD8xD8xD8xD8xD8xD8xDxDxDx

conn2.sendall(gen_headers().encode()+input_from_FFMPEG)
您的代码每1024字节视频重复发送一次HTTP头。您只需要在收到GET请求后发送一次头。然后发送将作为视频数据的正文

另外,在回复之前阅读请求:conn2.recv(1024)。我发现这是必要的,但是,我没有使用Windows

还有一件事,HTTP头应该由
\r\n
分隔,而不仅仅是
\n
,因此,如果上面的问题无法解决,请尝试更改它。

使用此行:

conn2.sendall(gen_headers().encode()+input_from_FFMPEG)
您的代码每1024字节视频重复发送一次HTTP头。您只需要在收到GET请求后发送一次头。然后发送将作为视频数据的正文

另外,在回复之前阅读请求:conn2.recv(1024)。我发现这是必要的,但是,我没有使用Windows


还有一件事,HTTP头应该由
\r\n
分隔,而不仅仅是
\n
,因此,如果上述问题无法解决,请尝试更改它。

谢谢您的建议,但现在我收到了“错误10053”-“主机中的软件中止了已建立的连接”我在e'while True:'行并在循环中发送接收到的数据。@arussell:更新了答案,并提供了更多建议。谢谢,我能够使用webm格式播放视频,并提供了您关于标题的建议。我更改了python代码和FFMPEG行以提供MP4视频,现在我得到了相同的10053错误。您能告诉我怎么做吗o实现此“在答复之前读取请求:conn2.recv(1024)"或者告诉我,为了获得有关错误的更多信息或解决错误,还需要做些什么。我刚刚编辑了mp4的python代码和FFMPEG行,并在出现错误的地方添加了字节类型数据。感谢您的建议,但现在我得到了“错误10053”-“主机中的软件中止了已建立的连接”我正在“while True:”行之前发送标题,并在循环中发送接收到的数据。@arussell:更新了答案,并提供了更多建议。谢谢,我能够使用webm格式播放视频,并提供了您关于标题的建议。我更改了python代码和FFMPEG行以提供MP4视频,现在我得到了same 10053错误。您能告诉我如何实现“在答复之前读取请求:conn2.recv(1024)”吗?或者告诉我为了获得有关错误的更多信息或解决错误,还应该做些什么。我刚刚编辑了mp4的python代码和FFMPEG行,并在出现错误的地方添加了字节类型数据。