2016-06-10 54 views
0

我在擺弄ffmpeg,從視頻中提取jpg圖片。我使用-filter_complex將輸入流分成兩個輸出流,因爲我從直接http鏈接(VPS上的可用空間稀缺)處理視頻,而且我不想整個視頻都讀兩遍(流量配額也很稀少)。此外,我需要兩個系列的pitcures,一個用於應用一些濾鏡(fps變化,縮放,不銳利,裁剪,縮放),然後用肉眼選擇它們,另一個系列未觸及(期望fps更改,裁剪黑色邊框),從第一系列中選擇後使用它們進一步處理。我從Ruby腳本中調用了我的ffmpeg命令,因此它包含一些字符串插入/替換,格式爲#{}。我的工作命令行看起來像:FFmpeg在使用-filter_complex和分割濾鏡時提取不同的幀數

ffmpeg -y -fflags +genpts -loglevel verbose -i #{url} -filter_complex "[0:v]fps=fps=#{new_fps.round(5).to_s},split=2[in1][in2];[in1]crop=iw-#{crop[0]+crop[2]}:ih-#{crop[1]+crop[3]}:#{crop[0]}:#{crop[1]},scale=#{thumb_width}:-1:flags=lanczos,unsharp,lutyuv=y=gammaval(#{gammaval})[out1];[in2]crop=iw-#{crop[0]+crop[2]}:ih-#{crop[1]+crop[3]}:#{crop[0]}:#{crop[1]}[out2]" -f #{format} -c copy #{options} -map_chapters -1 - -map '[out1]' -f image2 -q 1 %06d.jpg -map '[out2]' -f image2 -q 1 big_%06d.jpg 

#{}選項時輸出的MP4,那麼它的價值是「-movflags frag_keyframe + empty_moov」這樣我就可以將其發送到標準輸出,而不尋求能力和上傳設置在沒有製作大量臨時視頻文件的情況下流到某處 所以我得到了兩個系列的照片,其中一個被過濾,銳化,另一個實際上沒有任何變化。我還在標準輸出上獲得了視頻的輸出流,由Open3.popen3庫處理,連接另外兩個命令輸入的輸出流。

問題出現在我想要在視頻中查找給定點並省略STDOUT上的流式視頻輸出時。我嘗試給定的時間代碼之前申請合併求,快速搜尋和慢尋求的確切時間碼,浮秒給出:

ffmpeg -report -y -fflags +genpts -loglevel verbose -ss #{(seek_to-seek_before).to_s} -i #{url} -ss #{seek_before.to_s} -t #{t_duration.to_s} -filter_complex "[0:v]fps=fps=#{pics_per_sec},split=2[in1][in2];[in1]crop=iw-#{crop[0]+crop[2]}:ih-#{crop[1]+crop[3]}:#{crop[0]}:#{crop[1]},scale=#{thumb_width}:-1:flags=lanczos,unsharp,lutyuv=y=gammaval(#{gammaval})[out1];[in2]crop=iw-#{crop[0]+crop[2]}:ih-#{crop[1]+crop[3]}:#{crop[0]}:#{crop[1]}[out2]" -map '[out1]' -f image2 -q 1 %06d.jpg -map '[out2]' -f image2 -q 1 big_%06d.jpg 

運行此命令我得到所需要的兩個系列的圖片,但他們含有不同數目的圖像,233與484。

實際值可以從該內插/取代的命令行被讀取:

ffmpeg -report -y -fflags +genpts -loglevel verbose -ss 1619.0443599999999 -i fabf.avi -ss 50.0 -t 46.505879999999934 -filter_complex "[0:v]fps=fps=5,split=2[in1][in2];[in1]crop=iw-0:ih-0:0:0,scale=280:-1:flags=lanczos,unsharp,lutyuv=y=gammaval(0.526316)[out1];[in2]crop=iw-0:ih-0:0:0[out2]" -map '[out1]' -f image2 -q 1 %06d.jpg -map '[out2]' -f image2 -q 1 big_%06d.jpg 

詳細的日誌可以在這裏找到:http://www.filefactory.com/file/1yih17k2hrmp/ffmpeg-20160610-223820.txt 最後一行之前,它顯示188個重複的幀。

我也試過傳遞「-vsync 0」選項,但沒有幫助。當我用兩個不同的命令行以兩個連續的步驟生成兩個系列圖像時,沒有問題出現,我在兩個系列課程中都獲得了相同數量的圖像。所以我的問題是,我如何使用後面的命令行,通過只讀取/解析遠程視頻文件來生成兩個系列的圖像?

+0

請編輯您的問題以包含您的實際Ruby代碼,而不僅僅是ffmpeg命令。 –

回答

2

你要複製-ss-t選項第2個輸出,以及即

...-f image2 -q 1 %06d.jpg -map '[out2]' -ss 50 -t 46.5 -f image2 -q 1 big_%06d.jpg 

每個輸出選項(這些不-i前)僅適用於緊跟輸出。