ffmpeg合併兩路rtmp流並推送
ffmpeg實現兩路流的覆蓋
實現兩路流的覆蓋可以使用ffmpeg的overlay引數,將一路流覆蓋到另外一路流之上。
overlay引數簡介
overlay=x:y
這裡x和y表示距離左上角的座標偏移
例子
ffmpeg -i “rtmp://ip:port/firststream” -i “rtmp://ip:port/secondstream” -filter_complex overlay=20:16 -f flv “rtmp://ip:port/addstream”
將secondstream這路流覆蓋到firststream這路流之上,secondstream的座標位於左上角偏移20:16的位置,也就是x偏移20畫素,y偏移16畫素。
ffmpeg實現四路流的合併
命令
ffmpeg -i “rtmp://ip:port/onestream” -i “rtmp://ip:port/threestream” -i “rtmp://ip:port/fourstream” -i “rtmp://ip:port/twostream” -filter_complex “nullsrc=size=640x480 [base];[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];[base][upperleft] overlay=shortest=1 [tmp1];[tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240” -f flv “rtmp://ip:port/outstream”
整個命令特別複雜,但是仔細分析起來,確實還是比較清晰。
整體的邏輯是
ffmpeg -i 多路流 -filter_complex 合併引數 -f flv 合併後的一路流
核心部分就是合併引數。
引數簡介
filter_complex
filter complex可以很好的解決我們視訊流合併的問題,complex的簡單原理如下:
filter complex引數
nullsrc=size=640x480 [base];[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];[base][upperleft] overlay=shortest=1 [tmp1];[tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240
整個引數可以分為兩個部分,第一部分:
nullsrc=size=640x480 [base];[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
這個部分主要是劃分了基礎層和上面的四個分割槽,對每個分割槽輸入的流和解析度、pts作何設定。
首先定義了基礎的layer:nullsrc=size=640x480 [base],輸入是null。大小是640x480,名字是base。然後定義了之上的四個部分:
[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]
[0:v]告訴ffmpeg從第一個輸入來獲取流,設定pts,設定大小320x240,名字upperleft。
第二部分:
[base][upperleft] overlay=shortest=1 [tmp1];[tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240
主要是設定這四個部分在整個顯示層上的分佈。
[base][upperleft] overlay=shortest=1 [tmp1]
[upperleft]是第一部分定義好的輸入流,overlay在[base]之上。shortest=1就是當輸入停止的時候延遲1秒結束。座標是預設[0,0]。tmp1是給這個部分取的名字,方便後續使用。
[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
[upperright]overlay在[tmp1]之上,座標是[320,0]。這部分的名字是[tmp2]。