標籤:rtp udp rtmp ffmpeg h.264
這兩天研究了FFmpeg發送流媒體的命令,在此簡單記錄一下以作備忘。
1. UDP1.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. RTP2.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. RTMP3.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的。
有關RTMP的處理,可以參考文章:ffmpeg處理RTMP流媒體的命令大全
4. 測延時
測延時有一種方式,即一路播放發送端視頻,另一路播放流媒體接收下來的流。播放發送端的流有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本身是可以指定多個輸出的。本命令相當於指定了兩個輸出。
播放接收端的方法前文已經提及,在此不再詳述。