1. 程式人生 > >FFmpeg命令列操作流媒體

FFmpeg命令列操作流媒體

這個流媒體的理解我認為就是我們看到的音視訊檔案,然後通過網際網路來進行傳遞的一種處理音視訊流媒體的壓縮,錄製,編輯等操作。FFmpeg比較強大可以實現這些功能。

FFmpeg釋出與錄製RTMP流

首先簡單瞭解一下RTMP:
它是直播中最為常見的一種實時直播流,詳細的介紹與描述我找了一篇文章看了一下檢視
因為直播的RTMP是出現了就沒有的,我們可以通過FFmpeg把它錄製下來,就是說只要有一個RTMP地址就可以錄製下來,這個還是很方便的。

RTMP引數介紹

  • rtmp_app:RTMP流釋出點
  • rtmp_buffer:客戶端buffer大小(單位:毫米),預設為3秒
  • rtmp_conn:在RTMP的Connect命令中增加自定義AMF資料
  • rtmp_flashver:設定模擬的flashplugin的版本號
  • rtmp_live:指定RTMP流媒體播放型別(any:直播或點播隨意 live:直播 recorded:點播)
  • rtmp_pageurl:播放時所在Web頁面URL
  • rtmp_playpath:RTMP流播放Stream地址
  • rtmp_subscribe:直播流名稱,預設為rtmp_playpath的值
  • rtmp_swfhash:解壓swf檔案後的SHA256的hash值
  • rtmp_swfsize:swf檔案解壓後的大小
  • rtmp_swfurl:RTMP的Connect命令中設定的swfURL播放器RRL
  • rtmp_swfverify:設定swf認證時swf檔案的URL地址
  • rtmp_tcurl:RTMP的Connect命令中設定的tcURL目標釋出點地址
  • rtmp_listen:開啟RTMP服務時所監聽的埠
  • listen:與rtmp_listen相同
  • timeout:監聽rtmp埠時設定的超時時間

rtmp_app

通過rtmp_app設定推流釋出點,錄製直播視訊示例:

ffmpeg -rtmp_app live -i rtmp://live.hkstv.hk.lxdns.com/live/hks -c copy -f flv output.flv

釋出流示例:

ffmpeg -re -i input.mp4 -c copy -f flv -rtmp_app
live rtmp://publish.chinaffmpeg.com

這個會出現一個錯誤:
Server error: identify stream failed.這就要設定下面介紹的引數了
這裡要一個流媒體的伺服器我們就可以把本地的mp4檔案推上去,之前有一篇搭建流媒體伺服器的可以做到。檢視

rtmp_playpath

新增這個引數來推流:

ffmpeg -re -i input.mp4 -c copy -f flv -rtmp_app live -rtmp_playpath class rtmp://publish.chinaffmpeg.com

上面這個rtmp的流地址是我看到書上面的一個地址,我們同樣可以在本地搭建流媒體伺服器的方式來換成自己的。
執行以後成功了。
現在保持我們推的直播流

ffmpeg -rtmp_app live -rtmp_playpath class -i rtmp://publish.chinaffmpeg.com -c copy -f flv output.flv

推流和拉流我們配置了兩個引數rtmp_app和rtmp_playpath有一種簡便方式不用寫這兩個引數,之間在rtmp地址中設定好
推流:

ffmpeg -i input.mp4 -c copy -f flv rtmp://publish.chinaffmpeg.com/live/class

拉流:

ffmpeg -i rtmp://publish.chinaffmpeg.com/live/class -c copy -f flv output.flv

FFmpeg錄製RTSP流

通過命令ffmpeg -h demuxer=RTSP檢視RTSP協議相關的配置引數。

TCP方式錄製RTSP流

ffmpeg -rtsp_transport tcp -i rtsp://xxx -c copy -f mp4 output.mp4

FFmpeg錄製HTTP流

HTTP流的流媒體伺服器也是很常見的。我們看如何拉取這種流

ffmpeg -ss 30 -seekable 0 -i http://xxx -c copy output.mp4

命令執行後seekable設定為0,則FFmpeg的引數ss指定seek的時間位置。並且會一直處於阻塞狀態。如果設定seekable為1則可以通過FFmpeg對HTTP服務進行seek操作,不會有異常情況

FFmpeg錄製和釋出UDP/TCP流

FFmpeg不止支援RTMP,HTTP這類高層協議,偏底層一點的TCP,UDP協議都支援。

TCP使用

  • TCP監聽接受流
ffmpeg -listen 1 -f flv -i tcp://xxx -c copy -f flv output.flv
  • TCP請求釋出流
ffmpeg -re -i input.mp4 -c copy -f flv tcp://xxx
  • 監聽埠超時listen_timeout

超過監聽5秒退出

ffmpeg -listen_timeout 5000 -listen 1 -f flv -i tcp://xxx -c copy -f flv output.flv
  • TCP拉流超時引數
ffmpeg -timeout 20000000 -i tcp://xxx -c copy -f flv output.flv
  • TCP傳輸buffer大小設定send_buffer_size/recv_buffer_size
    buffer設定越小,傳輸就會越頻繁,網路開銷就會越大
ffmpeg -re -i input.mp4 -c copy -send_buffer_size 265 -f flv tcp://xxx
  • 繫結本地UDP埠localport
    使用FFmpeg的UDP傳輸資料時,預設會由系統分配本地埠,使用localport引數時可以設定監聽本地埠
ffmpeg -re -i input.mp4 -c copy -localport 23456 -f flv udp://xxx

FFmpeg推多路流

早期FFmpeg在轉碼後輸出直播流時並不支援編碼一次之後輸出多路直播流,需要使用管道方式進行輸出,現在的新版已經支援tee檔案封裝以及協議輸出,可以使用tee進行多路流輸出

管道方式輸出多路流

ffmpeg -i input -acodec acc -vcodec libx264 -f flv - | ffmpeg -f mpegts -i -c copy output1 -c copy output2 -c copy output3

上述音訊編碼為acc,視訊編碼為libx264,輸出格式為FLV,然後輸出之後通過管道傳給另一條ffmpeg命令對codec的copy可以實現一次編碼多次輸出

ffmpeg -i input.mp4 -vcodec libx264 -acodec acc -f flv - | ffmpeg -f flv -i - -c copy -f flv rtmp://xxx -c copy -f flv rtmp://xxx

執行完在RTMP伺服器包含兩路直播流。

tee封裝格式輸出多路流

ffmpeg -re -i input.mp4 -vcodec libx264 -acodec aac -map 0 -f tee "[f=flv] rtmp://xxx | [f=flv] rtmp://xxx

命令執行以後編碼一次輸出tee封裝格式,格式中包含兩個FLV格式的RTMP流。

tee協議輸出多路流

FFmpeg 3.1.3之後支援tee協議輸出多路流。

ffmpeg -re -i input.mp4 -vcodec libx264 -acodec aac -f flv "tee:rtmp://xxx|rtmp://xxx"

這個命令好像比上面的都簡單一些。

FFmpeg生成HDS流

通過命令ffmpeg -h muxer=hds可以檢視HDS的引數

window_size引數控制檔案列表大小

ffmpeg -i input -c copy -f hds -window_size 4 output

extra_window_size引數控制檔案個數

window_size控制檔案列表大小,extra_window_size可以控制殘留檔案個數

ffmpeg -re -i input.mp4 -c copy -f hds -window_size 4 -extra_window_size 1 output

FFmpeg生成DASH流

列表型別直播除了HLS和HDS之外,還有一種比較流行的列表方式是DASH方式直播。通過命令列ffmpeg -h muxer=dash檢視dash的一些引數
使用示例:

ffmpeg -re -i input.mp4 -c:v copy -acodec copy -f dash -window_size 4 -extra_window_size 5 index.mpd

執行完會生成檔案索引列表index.mpd,檔案列表長度為4個切片長度,切片之外會保留5個切片。生成的音訊切片有9個視訊切片有9個,其中包含2個初始化資訊切片,1個索引檔案。

通過引數single_file將切片列表中的檔案寫入到一個檔案

ffmpeg -re -i input.mp4 -c:v copy -acodec copy -f dash -window_size 4 -extra_window_size 5 -single_file 1 index.mpd

執行完成生成一個索引檔案,一個音訊檔案,一個視訊檔案。