2016-01-24 37 views
1

嗨,我有一個問題,我在Raspberry Pi上有openCV和ffmpeg,我試圖從樹莓派傳輸實時視頻。目前我有openCV的輸出輸出保存爲.avi文件,我有一個命令ffmpeg ffmpeg -i out.avi -hls_segment_filename '%03d.ts' stream.m3u8 此命令將輸出創建播放列表(.m3u8)和段(.ts)。將處理後的視頻從OpenCV傳遞到FFmpeg進行HLS流式傳輸(Raspberry PI)

目前我有C++編程的openCV(這不能改變)我有一個可執行的程序,我有一個可執行的C++和Bash腳本中的上述ffmpeg。

#!/bin/bash 

while true; do 
./OpenCV 
ffmpeg -i out.avi -hls_segment_filename '%03d.ts' stream.m3u8 
done 

這並不讓我流的處理的OpenCV視頻我的問題是因爲bash腳本是在一個while循環它使重置播放列表和.ts文件,所以我必須不斷地按客戶端播放連接。

反正有這個嗎?

我試過包括一個變量,會增加每個循環,但如果我用這個替換'%03d'我得到一個錯誤。

回答

1

如果你堅持使用一個循環程序(OpenCV)和ffmpeg,那麼你可以指定使用start_numberstream.m3u8初始HLS序列號。事情是這樣的:

... as before ... 
ffmpeg -i out.avi -hls_segment_filename '%03d.ts' --start_number $I stream.m3u8 

其中I是,你必須每次遞增循環運行的變量。 但是這種方法非常脆弱,可能會導致錯誤的流,因爲它假定ffmpeg將只生成一個單獨的段,但實際上它可能會生成多個段。

一個更好的方法是並行運行OpenCVffmpeg並使它們相互交談。通過這樣做,將不需要寫入臨時文件out.avi並按順序運行OpenCVffmpeg,並保持媒體序列同步。

我認爲你可以像這樣破解它。請注意,您可能需要更改OpenCV,使其不斷地寫入out.avi並在一段時間後沒有返回:

./OpenCV & 
tail -n +0 -f out.avi | ffmpeg -i pipe:0 -hls_segment_filename '%03d.ts' stream.m3u8 

更好的辦法是改變你的程序寫入到標準輸出或命名管道並運行它像所以:

./OpenCV | ffmpeg -i pipe:0 -hls_segment_filename '%03d.ts' stream.m3u8 
+0

謝謝斯韋特林,只是一個更新,我只嘗試了底部的2個例子。使用tail命令的人大約有60%的時間工作,但它在流式傳輸時也很容易凍結,而底部的一個在我的代碼中根本不起作用。我已經使用cout <<在代碼中將C++代碼改爲stdout。我也可能會遇到這個C++代碼的問題,因爲它還包含一個while(1)循環,它使用raspivid命令拍攝1秒的視頻,然後將幀傳遞給openCV進行處理。當完成回報拍攝另一個&等等。我希望在週末看這個。 –

相關問題