2015-06-18 99 views
0

我試圖讓ffmpegs輸出到一個命名管道,在那裏我可以從另一個shell讀取。我不需要傳輸視頻流,只需要下面的信息即可獲得轉換過程的狀態。我不能夠實現任何方式的管道的行爲,但我可以用下面的命令將數據寫入一個文件:管道ffmpeg輸出到命名管道

ffmpeg -i vid.mov -vcodec h264 -acodec aac -strict -2 -y vid.mp4 > fflog.txt 2>&1 

這導致以下輸出fflog.txt

Stream mapping: 
Stream #0:1 -> #0:0 (h264 (native) -> h264 (libx264)) 
Stream #0:0 -> #0:1 (aac (native) -> aac (native)) 
Press [q] to stop, [?] for help 
frame= 50 fps=0.0 q=0.0 size=  0kB time=00:00:03.20 bitrate= 0.1kbits/s 
frame= 73 fps= 70 q=28.0 size=  230kB time=00:00:04.05 bitrate= 465.4kbits/s 
frame= 100 fps= 65 q=28.0 size=  462kB time=00:00:05.44 bitrate= 695.3kbits/s 

之後我可以通過

tail -f -1 fflog.txt 

超出文件。但是我認爲,這些界限並沒有被正確地轉義。 VI顯示我下面的:

frame= 50 fps=0.0 q=0.0 size=  0kB time=00:00:03.20 bitrate= 0.1kbits/s 
^Mframe= 73 fps= 70 q=28.0 size=  230kB time=00:00:04.05 bitrate= 465.4kbits/s 
^Mframe= 100 fps= 65 q=28.0 size=  462kB time=00:00:05.44 bitrate= 695.3kbits/s 
^Mframe= 125 fps= 61 q=28.0 size=  608kB time=00:00:06.48 bitrate= 767.5kbits/s 

所以問題是:

  1. 如何將CRLF轉換爲UNIX像LF通過尾-n返回正確的數據?
  2. 甚至更​​好:如何正確管道ffmpeg結果到一個mkfifo命名管道?
  3. 還是最普遍的:有沒有一種更聰明的方式來實現我的目標?
+0

dos2unix的文件? – rogerdpack

回答

1

讓我們先解決行結尾。 ffmpeg使用回車符('\ r')將光標發送回行的開頭,使其不會用進度消息填滿終端。用tr,修復很簡單。

ffmpeg -i input.mov output.webm 2>&1 | tr '\r' '\n' 

現在您應該分別看到每條進度線。如果我們將管道或重定向到其他地方,事情會變得更有趣。

ffmpeg -i input.mov output.webm 2>&1 | tr '\r' '\n' | cat 

請注意,輸出顯示爲塊而不是逐行顯示。如果您的目的不可接受,您可以使用stdbuf禁用tr的輸出緩衝。

ffmpeg -i input.mov video.webm 2>&1 | stdbuf -o0 tr '\r' '\n' | cat 

爲了讀取來自其他shell的輸出,命名管道可能工作。但是,直到ffmpeg完成後,管道纔會結束,因此tail將不會打印任何內容。您可以使用其他工具(如catgrep)讀取正在運行的管道,但使用純文件可能更容易。

# shell 1 
ffmpeg -i input.mov output.webm 2>&1 | stdbuf -o0 tr '\r' '\n' > fflog.txt 

# shell 2 
tail -f fflog.txt