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
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
抓包如下:
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
本文来自博客园踩坑狭,作者:韩若明瞳,转载请注明原文链接:https://www.cnblogs.com/han-guang-xue/p/16056041.html