FFmpeg傳送流媒體的命令(UDP,RTP,RTMP)
這兩天研究了FFmpeg傳送流媒體的命令,在此簡單記錄一下以作備忘。
1. UDP
1.1. 傳送H.264裸流至組播地址
注:組播地址指的範圍是224.0.0.0—239.255.255.255
下面命令實現了傳送H.264裸流“chunwan.h264”至地址udp://233.233.233.223:6666
ffmpeg -re -i chunwan.h264 -vcodec copy -f h264 udp://233.233.233.223:6666
注1:-re一定要加,代表按照幀率傳送,否則ffmpeg會一股腦地按最高的效率傳送資料。
注2:-vcodec copy要加,否則ffmpeg會重新編碼輸入的H.264裸流。
1.2. 播放承載H.264裸流的UDP
ffplay -f h264 udp://233.233.233.223:6666
注:需要使用-f說明資料型別是H.264
播放的時候可以加一些引數,比如-max_delay,下面命令將-max_delay設定為100ms:
ffplay -max_delay 100000 -f h264 udp://233.233.233.223:6666
1.3. 傳送MPEG2裸流至組播地址
下面的命令實現了讀取本地攝像頭的資料,編碼為MPEG2,傳送至地址udp://233.233.233.223:6666。
ffmpeg -re -i chunwan.h264 -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666
1.4. 播放MPEG2裸流
指定-vcodec為mpeg2video即可。
ffplay -vcodec mpeg2video udp://233.233.233.223:6666
2. RTP
2.1. 傳送H.264裸流至組播地址。
下面命令實現了傳送H.264裸流“chunwan.h264”至地址rtp://233.233.233.223:6666
ffmpeg -re -i chunwan.h264 -vcodec copy -f rtp rtp://233.233.233.223:6666>test.sdp
注1:-re一定要加,代表按照幀率傳送,否則ffmpeg會一股腦地按最高的效率傳送資料。
注2:-vcodec copy要加,否則ffmpeg會重新編碼輸入的H.264裸流。
注3:最右邊的“>test.sdp”用於將ffmpeg的輸出資訊儲存下來形成一個sdp檔案。該檔案用於RTP的接收。當不加“>test.sdp”的時候,ffmpeg會直接把sdp資訊輸出到控制檯。將該資訊複製出來儲存成一個字尾是.sdp文字檔案,也是可以用來接收該RTP流的。加上“>test.sdp”後,可以直接把這些sdp資訊儲存成文字。
2.2. 播放承載H.264裸流的RTP。
ffplay test.sdp
3. RTMP
3.1. 傳送H.264裸流至RTMP伺服器(FlashMedia Server,Red5等)
面命令實現了傳送H.264裸流“chunwan.h264”至主機為localhost,Application為oflaDemo,Path為livestream的RTMP URL。
ffmpeg -re -i chunwan.h264 -vcodec copy -f flv rtmp://localhost/oflaDemo/livestream
3.2. 播放RTMP
ffplay “rtmp://localhost/oflaDemo/livestream live=1”
注:ffplay播放的RTMP URL最好使用雙引號括起來,並在後面新增live=1引數,代表實時流。實際上這個引數是傳給了ffmpeg的libRTMP的。
4. 測延時
4.1.測延時
測延時有一種方式,即一路播放傳送端視訊,另一路播放流媒體接收下來的流。播放傳送端的流有2種方式:FFmpeg和FFplay。
通過FFplay播放是一種眾所周知的方法,例如:
ffplay -f dshow -i video="Integrated Camera"
即可播放本地名稱為“Integrated Camera”的攝像頭。
此外通過FFmpeg也可以進行播放,通過指定引數“-f sdl”即可。例如:
ffmpeg -re -i chunwan.h264 -pix_fmt yuv420p –f sdl xxxx.yuv -vcodec copy -f flv rtmp://localhost/oflaDemo/livestream
就可以一邊通過SDL播放視訊,一邊傳送視訊流至RTMP伺服器。
注1:sdl後面指定的xxxx.yuv並不會輸出出來。
注2:FFmpeg本身是可以指定多個輸出的。本命令相當於指定了兩個輸出。
播放接收端的方法前文已經提及,在此不再詳述。