
我正在嘗試使用 ffmpeg 對輸入視訊進行多次混合/重新編碼/複製操作,但我嘗試過的方法遇到了障礙;在繼續測試之前,我想確認軟體是否真的可以做到這一點。 (這是一個即時串流設置,它從 LAN 上的另一台 PC 接收一個即時串流,並將其存檔/重新串流傳輸到多個 RTMP 目標,因此需要標記-re
並需要在一次操作中完成所有操作。
輸入影片具有 1 個高位元速率 h.264 視訊串流和 4 個 PCM 音軌。
我需要的三個輸出:
- 1 個 8Mbps 的 h.246 編碼,僅音軌 1 的 aac 編碼
- 一個 12Mbps 的 h.264 編碼,僅音軌 1 的 aac 編碼(理想情況下使用與第一個輸出相同的編碼,即只需對音訊進行一次編碼)
- .mkv 的整個輸入的一份純流副本
(這些命令可能充滿錯誤和不好的做法,只是我要走的方向的整體思路。)
我嘗試過將split
/asplit
過濾器與tee
復用器結合使用,這在理論上似乎可行,只是使用過濾器不允許流複製/編解碼器直通(諷刺的是,在這種情況下,沒有對視頻流進行實際過濾,除了通過它)。
ffmpeg -re -init_hw_device qsv=hw -filter_hw_device hw -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i $INPUT \
-filter_complex "[0:v]split=3[twitch][youtube][passv];[0:a]asplit[stream][passa]" \
-map:v "[twitch]" -map:v "[youtube]" -map:v "[passv]" -map:a "[stream]:0" -map:a "[passa]" \
-c:v:0 h264_qsv -profile:v:0 high -preset:v:0 medium -g 120 -b:v:0 8M -maxrate:v:0 8M -bufsize:v:0 4M \
-c:v:1 h264_qsv -profile:v:1 high -preset:v:0 medium -g 120 -b:v:1 12M -maxrate:v:1 12M -bufsize:v:1 6M \
-c:v:2 copy \
-c:a:0 aac -b:a:0 320k \
-c:a:1 copy \
-f tee "[select=\'v:0,a:0\']8mbps.mkv|[select=\'v:1,a:0\']12mbps.mkv|[select=\'v:2,a:1\']copy.mkv"
我還嘗試了簡單的流映射到多個輸出,但看起來它實際上只處理一個視頻和音頻輸出,而且我不確定流映射是否可以用這種方式使用,所以這可能是一團糟。
ffmpeg -re -init_hw_device qsv=hw -filter_hw_device hw -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i $INPUT \
-map 0:0 -c h264_qsv -profile high -preset medium -g 120 -b 8M -maxrate 8M -bufsize 4M \
-map 0:0 -c h264_qsv -profile high -preset medium -g 120 -b 12M -maxrate 12M -bufsize 6M \
-map 0:1 -c aac -b 320k \
-map 0:a -c copy \
-f tee "[select=\'v:0,a:0\']8mbps.mkv|[select=\'v:1,a:1\']12mbps.mkv|[select=\'v:2,a:1\']copy.mkv"
讓事情變得更加複雜的是,我在這裡使用快速同步硬體編碼,並且希望-vf hwupload=extra_hw_frames=64,format=qsv
在可能的情況下應用於每個重新編碼,但在我的初始測試中,不清楚是否可以使用兩組過濾器,即使在不同的編碼上也是如此。
無論如何,這可以透過 ffmpeg 實現嗎?
答案1
我們可以使用三通分路器用於重複使用編碼的 aac 音頻,並使用流映射, 和流說明符:
ffmpeg -y -c:v h264_qsv -i in.mkv -map 0:v -map 0:v -map 0:a -c:v:0 h264_qsv -profile:v:0 high -preset:v:0 medium -g 120 -b:v:0 8M -minrate:v:0 8M -maxrate:v:0 8M -c:v:1 h264_qsv -profile:v:1 high -preset:v:1 medium -g 120 -b:v:1 12M -minrate:v:1 12M -maxrate:v:1 12M -c:a:0 aac -b:a:0 320k -f tee "[select=\'v:0,a\']8mbps.mkv|[select=\'v:1,a\']12mbps.mkv" -map 0 -c copy copy.mkv
根據需要新增-re
和替換輸入和輸出。
-c:v h264_qsv
- 應用QSV H.264硬體加速解碼(我們也可以使用-hwaccel qsv
)。-map 0:v -map 0:v -map 0:a
- 將輸入視訊串流對應到「第一」(0
) 和「第二」(1
) 輸出視訊串流(並對應音訊串流)。-c:v:0 h264_qsv -profile:v:0 high -preset:v:0 medium -g 120 -b:v:0 8M -minrate:v:0 8M -maxrate:v:0 8M
- 選擇h264_qsv
視訊編碼器,以及適用於輸出視訊串流的所有參數0
。-c:v:1 h264_qsv -profile:v:1 high -preset:v:1 medium -g 120 -b:v:1 12M -minrate:v:1 12M -maxrate:v:1 12M
- 選擇h264_qsv
視訊編碼器,以及適用於輸出視訊串流的所有參數1
。-c:a:0 aac -b:a:0 320k
- 選擇音訊編碼器和位元率。-f tee "[select=\'v:0,a\']8mbps.mkv|[select=\'v:1,a\']12mbps.mkv"
- “復用”相同編碼的音訊串流與兩個不同的視訊串流。
第一個輸出視訊串流 (0
) 被「重複使用」到8mbps.mkv
輸出檔。
第二個輸出視訊串流 (1
) 被「重複使用」到12mbps.mkv
輸出檔。-map 0 -c copy copy.mkv
- 應用第二個輸出(因為它出現在第一個輸出之後)。
-map 0
- 將所有輸入流從輸入映射到輸出。
-c copy
- 複製所有輸入流而不重新編碼。
為了進行測試,我創建了一個合成影片檔案in.mkv
:
ffmpeg -y -f lavfi -i mandelbrot=size=1920x1080:rate=30 -f lavfi -i sine=frequency=400 -c:v libx264 -strict -2 -c:a dca -ar 44100 -pix_fmt yuv420p -t 5 in.mkv
筆記:
-b:v:0 4M -minrate:v:0 4M -maxrate:v:0 4M
應用恆定位元率(我不確定您是否真的需要它)。bufsize
參數不適用於h264_qsv
編碼器(我沒有嘗試解決這個問題)。