1. 程式人生 > >ffmpeg合併兩路rtmp流並推送

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]。