ffmpeg 將直播流 轉化為 mp4保存


ffmpeg 轉換方法 流 為 mp4片段

# 將流轉換為 mp4, 這里的流可以是 rtp, 也可以是 rtmp
ffmpeg -y -i rtsp://192.168.100.30:554/live/test -vcodec copy -t 500  -f mp4 ttt.mp4   
# 將流轉換為 mp4, 並按照2分鍾就分割成多個文件 -r 設定幀速率, 一分鍾分割, -segment_time 120, 兩分鍾 120s
ffmpeg -i rtsp://192.168.100.30:554/live/test -r 1/60 -c copy -map 0 -f segment -segment_time 120 -segment_format mp4 ".\\test\\out%03d.mp4"
# 將流轉換為 mp4, 分割短視頻並生成對應的縮略圖
ffmpeg -i rtsp://192.168.100.30:554/live/test -r 1/60 -f image2 ".\\test\\images%05d.png" -c copy -map 0 -f segment -segment_time 60 -segment_format mp4 ".\\test\\out%03d.mp4"
# 將rtp 96 協議類型為1889的流轉換為 mp4, 並分割視頻, sdp 文件文章下有說明
ffmpeg -protocol_whitelist "file,udp,rtp" -i xxx.sdp -r 1/60 -c copy -map 0 -f segment -segment_time 120 -segment_format mp4 ".\\test\\out%03d.mp4"
# 取消緩沖區,降低延遲
ffplay "udp://232.0.0.6:10000" -fflags nobuffer -nofind_stream_info -analyzeduration 10000 -max_delay 0
# 有時候我們取消緩沖區, 在內網播放延遲如果還是比較大的話, 可以加上 -vf setpts =PTS/2, 意思就是加速視頻播放, 也可以理解為修正幀數 http://ericliu.cn/2018/08/15/ffmpeg-setpts/
ffplay -fflags nobuffer -nofind_stream_info -analyzeduration 10000 -max_delay 0 -vf setpts=PTS/2 -protocol_whitelist "file,udp,rtp" test.sdp
# 另外 rtp包可以使用 udp協議播放
ffplay rtp://@232.0.0.6:10000
ffplay udp://232.0.0.6:10000

# 上述方法轉成 mp4片段會出現個問題, 每個片段的起始播放時間是連續的,如何讓每個mp4視頻為單獨的文件呢,提供兩種方式
# 1.直接使用 ffmpeg 二次轉換mp4視頻, 在這里我使用的是第一種方式
ffmpeg -i out006.mp4 -c copy tttt.mp4
# 2.使用串流格式, 既將 -segment_format 使用參數 mpegts, 這時生成的是MP4串流格式,使用vlc可播放,但是在瀏覽器上是不支持播放的,而且點擊快進的時候會卡頓兩秒左右,沒有原生mp4格式支持好
ffmpeg -i rtsp://192.168.100.30:554/live/test -r 1/60 -c copy -map 0 -f segment -segment_time 120 -segment_format mpegts ".\\test\\out%03d.mp4"

ffplay 播放sdp rtp 文件

##有些RTP流是需要分裝到sdp文件中的, 播放指令如下,將rtp,file,udp 添加到白名單
ffplay -protocol_whitelist "file,udp,rtp"  test.sdp
ffmpeg -protocol_whitelist "file,udp,rtp" -i test.sdp -vcodec copy -t 500  -f mp4 ttt.mp4

# 生成rtp type 96 的sdp文件
ffmpeg -re -i t4.mp4 -vcodec copy -an  -f rtp rtp://192.168.100.10:10000 > t222.sdp

sdp 文件格式示例, 這里是ffmpeg傳輸視頻生成的完整的sdp文件,如果缺寫參數,可以使用vlc播放,卻不能使用ffplay播放,或者是 ffplay在window能播放,但是在linux上播放不了

SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 192.168.100.10
t=0 0
a=tool:libavformat 58.51.101
m=video 10016 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1

ffmpeg 日志輸出

ffmpeg -loglevel debug -protocol_whitelist "file,udp,rtp" -i test.sdp -vcodec copy -t 500  -f mp4 ttt.mp4

ffmpeg 將音頻和視頻分開

ffmpeg  -i 2_6.mp4 -vn out.mp3
ffmpeg -i 2_6.mp4 -an out.mp4

ffmpeg rtp 推流

將畫面和音頻 通過 rtp_mpegts 傳輸

推流 ffmpeg -re -i t4.mp4 -vcodec h264 -f rtp_mpegts rtp://192.168.100.10:10000
播放 ffplay -protocol_whitelist "file,udp,rtp" rtp://@192.168.100.10:10000
抓包如下, 可以看到 payload type 為 MPEG-2
image

RTP純視頻推流

RTP的包如果類型是 type-96, 則rtp包只包含純數據,只能單獨推送畫面或者是音頻, -an 畫面, -vn 音頻,這里> t222.sdp 是為了生成sdp格式的文件,用於播放,可以不寫
ffmpeg -re -i t4.mp4 -vcodec copy -an -f rtp rtp://192.168.100.10:10000 > t222.sdp
ffplay -protocol_whitelist "file,udp,rtp" t222.sdp
抓包如下:
image

ffmpeg 安裝

wget https://www.nasm.us/pub/nasm/releasebuilds/2.14/nasm-2.14.tar.gz  ## 安裝 x264 需要 nasm
cd nasm-2.14 && ./configure && make && make install

git clone https://code.videolan.org/videolan/x264.git
cd x264 && ./configure --prefix=/usr/x264/ --includedir=/usr/local/include --libdir=/usr/local/lib --enable-shared && make && make install

curl -O http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz  ## 下載依賴
tar -zxvf yasm-1.3.0.tar.gz && cd yasm-1.3.0 && ./configure && make && make install
git clone https://gitee.com/mirrors/ffmpeg
cd ffmpeg && sudo ./configure && sudo make && sudo make install


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM