2016-03-18 2 views
0

Я пытаюсь написать скрипт python для передачи видео по HTTP и отображения его с помощью тега HTML5, я использую FFMPEG для передачи видео по HTTP и получения видео через сокеты в Python. Кажется, что FFMPEG отправляет видео, и мой скрипт Python получает его, но по какой-то причине я не могу отображать его в своем веб-браузере и не видеть видимой ошибки в моем сценарии.Потоковая передача видео Python и FFMPEG не отображается через HTML5

Любая помощь будет высоко оценена.

Это FFMPEG линии я использую для отправки видео HTTP

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;\[email protected])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 эта строка:

conn2.sendall(gen_headers().encode()+input_from_FFMPEG) 

Ваш код повторно отправляет заголовки HTTP один раз на каждые 1024 байта видео. Вам нужно только отправить заголовки один раз после получения запроса GET. Затем отправьте тело, которое будет видеоданных.

Кроме того, прочитайте запрос перед ответом: conn2.recv (1024). Я нашел это необходимым, однако я не использую Windows.

Еще одна вещь. Заголовки HTTP должны быть разделены \r\n, а не только \n, поэтому попробуйте изменить это, если выше это не исправить.

+0

спасибо за ваше предложение, но теперь я получаю сообщение об ошибке 10053 - «Установленное соединение было прервано программным обеспечением вашего хост-компьютера» Я отправляю заголовок непосредственно перед линией «while True:» и отправка полученных данных внутри цикла. – arussell

+0

@arussell: обновленный ответ с еще несколькими предложениями. – mhawke

+0

Спасибо, я смог воспроизвести видео в формате webm с вашим предложением о заголовке. Я изменил код python и строку FFMPEG, чтобы подать видео MP4, и теперь я получаю ту же ошибку 10053. Можете ли вы рассказать мне, как реализовать это «прочитайте запрос до ответа: conn2.recv (1024)» или скажите мне, что еще нужно сделать, чтобы получить дополнительную информацию об ошибке или решить ее. – arussell

Смежные вопросы