1

我有一個可以實時生成視頻的程序。現在我想在生成視頻的同時在線播放此視頻。有誰知道一個簡單的方法來做到這一點?如何在線生成視頻和失敗的CGI方法時在線播放視頻。

我正在描述一個我嘗試過但沒有工作的CGI方法,但請注意,我對所有可實現我目標的選項都開放。我只是想知道是否有人知道爲什麼我的方法不工作,我應該如何修復它

我設置內容類型爲mpeg爲例,並週期性地在mpeg文件中打印出一大塊數據。但該視頻只能持續很短的時間並停止播放。我的代碼是這樣的(在Python中)。

print "Content-type: video/mpeg" 
print 
f = open("test2.mpg") 
while (True): 
    st = f.read(1024*1024) 
    sys.stdout.write(st) 
    time.sleep(0.5) 

雖然這將工作正常。我真的不明白爲什麼這兩個程序的輸出是不同的。但很明顯,因爲我不能等到在閱讀之前生成整個文件我不能使用這種方法。

print "Content-type: video/mpeg" 
print 
f = open("test2.mpg") 
print f.read() 

回答

0

什麼類型的文件是test2.mpg? 如果它是一個mpeg4文件,你的方法將無法工作,因爲你將在文件的開始或結尾有標題。 如果你的文件是一個mpeg2傳輸流,那麼這應該工作。

0

你可能打讓你的循環失敗結束文件,無論是與EOFError或崩潰的地方。如果視頻正在實時生成,除非test2.mpg是一個FIFO管道(使用mkfifo創建 - 在這種情況下,您一次只能有一個閱讀器) - 從管道讀取數據可能不會返回數據,並且您的循環可能運行得非常快,遠快於視頻數據的保存。所以你需要一個處理EOF的策略。

此外,您需要確保刷新輸出 - 既在此程序中的sys.stdout.write()行之後,又在其他程序中的視頻流之後。由於你的循環沒有結束條件並且沒有輸出,並且你可能永遠不會寫入任何數據,所以可能是在循環的一次迭代之後,某些內容失敗,並且web服務器丟棄緩衝的數據。

此外,一次讀取1MB的恆定大小可能會導致延遲問題。爲了獲得更好的延遲,最好使用更小的尺寸。但是,爲了更好的質量和吞吐量,您可以使用更大的尺寸。但是,如果產生視頻的程序,您的cgi腳本或網絡服務器不是定期刷新,則等待時間點是沒有意義的。

我還建議查看「選擇」或「輪詢」/ epoll - 這兩種方法中的任何一種都可以更好地控制閱讀,並且可以通過睡眠直到數據來幫助您解決文件結束問題可用。如果你發現自己需要睡覺(0.5),你可能會更好地使用選擇/輪詢正確。