流相关
- 本地文件推流
1.mp4
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
ffmpeg -re -i music.mp4 -vcodec copy -acodec libmp3lame -f flv rtmp://120.24.34.25:1935/live/home
ffmpeg -re -i .\orange.mp4 -rtsp_transport tcp -vcodec h264 -f rtsp rtsp://heawill.top:554/test
2.mp3
ffmpeg -re -i 1.mp3 -vcodec copy udp://224.233.233.2:1234
ffmpeg -re -i music.mp3 -acodec libmp3lame -f flv rtmp://120.24.34.25:1935/live/home
ffmpeg -re -i music.mp3 -rtsp_transport tcp -acodec libmp3lame -f rtsp rtsp://heawill.top:554/test
3.h264
ffmpeg -re -i test.264 -vcodec copy -f h264 udp://10.0.192.82:6970
4.aac
ffmpeg -re -i 44kchannel2.aac -vcodec copy -acodec aac -f flv rtmp://120.24.77.25:1935/live/home
- 流媒体保存到本地
1.flv
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
2.mp4
ffmpeg -i rtmp://server/live/streamName -c copy dump.mp4
ffmpeg -i rtsp://server/live/streamName -c copy dump.mp4
3.mp3
ffmpeg -i rtmp://heawill.top/live/home -acodec libmp3lame xx.mp3
ffmpeg -rtsp_transport tcp -i rtsp://heawill.top/test -acodec libmp3lame xx.mp3
注意:rtsp时,如果不添加-rtsp_transport tcp指定网络连接模式,默认是udp的,而在windows下的ffmpeg如果udp不通,会自动测试连接tcp;而linux则不会,会一直卡在那里。
RTP
以下命令都会尝试sdp文件,播放也是打开此文件去播放
mp4文件的音频和视频分别推流到不同地址
ffmpeg -re -thread_queue_size 4 -i .\testmp4.mp4 -strict -2 -vcodec copy -an -f rtp rtp://127.0.0.1:6008 -acodec copy -vn -f rtp rtp://127.0.0.1:7008 -sdp_file sdp_file.sdp
只推MP4中的音频
ffmpeg -re -thread_queue_size 4 -i .\testmp4.mp4 -strict -2 -acodec copy -vn -f rtp rtp://127.0.0.1:7008 -sdp_file sdp_file.sdp
推流MP3
ffmpeg -re -thread_queue_size 4 -i .\123.mp3 -strict -2 -acodec mp3 -vn -f rtp rtp://127.0.0.1:7008 -sdp_file sdp_file.sdp
vlc无法解码,得使用ffplay
把wav文件以g711u编码发送
ffmpeg -re -thread_queue_size 4 -i .\bg.wav -strict -2 -acodec pcm_mulaw -vn -f rtp rtp://127.0.0.1:7008 -sdp_file sdp_file.sdp
直接复制wav文件的pcm裸流到rtp出去
ffplay直接播不行的,得其他程序自行处理播放
ffmpeg -re -i bg.wav -c:a copy -f rtp rtp://128.23.38.173:5100
ffplay播放rtp地址
ffplay -protocol_whitelist "file,udp,rtp" -i sdp_file.sdp
ffplay -protocol_whitelist "file,udp,rtp" -i "rtp://<server_ip>:"
如果播放其他设备推送到本地的,则将server_ip改为127.0.0.1即可。
ffplay -protocol_whitelist "file,rtp,udp" -acodec pcm_mulaw -i "rtp://192.168.1.10:5004"
可以通过-acodec和-vcodec选项指定音频和视频的编解码器,比如要解码PCMU音频,增加-acodec pcm_mulaw参数。
rtp标准的负载类型参考:
https://blog.csdn.net/caoshangpa/article/details/53008018
PCMU的8k音频数据则用0,PCMA的8k音频数据则用8,MPA编码格式(MPEG-1 Audio Layer III),即MP3则用14,指定了正确的负载类型和音频数据,一般用vlc或者ffplay都能播出。
参考
https://blog.csdn.net/hyl999/article/details/114015749
https://blog.csdn.net/sunxiaopengsun/article/details/93850568
https://blog.csdn.net/pyl88429/article/details/102841032
测试拉流地址
rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov
- 转流
1.参数复杂的低延迟(低延迟)
ffmpeg -use_wallclock_as_timestamps 1 -i "udp://127.0.0.1:5533" -f flv -vcodec libx264 -movflags frag_keyframe+empty_moov+faststart -tune zerolatency -crf 30 -preset ultrafast -g 1 -reset_timestamps 1 -vsync 1 -flags global_header -r 15 -listen 1 -fflags flush_packets -avioflags direct -flush_packets 1 -q 1 -s 1280x720 rtmp://127.0.0.1:1935/live/room
-listen 1 参数的作用:只有拉取rtmp流时,ffmpeg才会开始接收数据,默认是一直接收,此参数会造成如果停止拉取rtmp接收则ffmpeg运行直接退出,一般都不要加上这个参数
2.低延迟(时高时低)
ffmpeg -i udp://127.0.0.1:5533 -tune zerolatency -vcodec libx264 -preset ultrafast -f flv -s 1280x720 -q 1 rtmp://127.0.0.1:1935/live/room
3.高延迟
ffmpeg -i udp://127.0.0.1:5533 -vcodec libx264 -f flv -s 1280x720 -q 1 rtmp://127.0.0.1:1935/live/room
- 播流
1.rtmp直播流
ffplay -fflags nobuffer -analyzeduration 1000000 rtmp://127.0.0.1:1935/live/room
-fflags nobuffer 开启不缓存模式,直接播,可以实现低延迟
2.udp直播流
ffplay -f h264 udp://10.0.192.82:6970
3.rtsp直播流
ffplay.exe -rtsp_transport tcp rtsp://heawill.top/test
转码
- mp3转mp3
ffmpeg -i 1.mp3 -ar 44100 -ab 128k -acodec libmp3lame -ac 2 5.mp3
把1.mp3文件转为比特率128k,采样率44100的2声道的5.mp3文件,其中-aodec为指定编解码器
录制声卡
ffmpeg -f dshow -i audio="立体声混音 (2- Realtek High Definition Audio)" typing.wav
audio是声卡的名称,不同电脑可能会不一样
可执行文件下载地址
linux
https://www.johnvansickle.com/ffmpeg/
windows
https://www.gyan.dev/ffmpeg/builds/
官方下载地址
http://ffmpeg.org/download.html
参考
https://www.cnblogs.com/remember-forget/p/10372983.html
搭建rtsp,rtmp服务器
rtsp
rtsp可以用EasyDarwin,支持windwos和linux
https://github.com/EasyDarwin/EasyDarwin
rtmp
linux可以直接用docker镜像nginx-rtmp
sudo docker pull tiangolo/nginx-rtmp
sudo docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp
https://zhuanlan.zhihu.com/p/52631225
windwos同样可以用nginx-rtmp
链接:https://pan.baidu.com/s/1rKPpBI354hwIh8qZ1L2CIQ
提取码:1234
参数说明
ffmpeg
-acodec
指定编码器,比如mp3,pcm_mulaw,pcm_alaw等,pcm_mulaw对应wav文件
如果不指定该参数,则由ffmpeg自动判断,比如输入wav文件,-acodec自动为pcm_mulaw
pcm_alaw 代表进行g711a编码, pcm_mulaw代表进行g177u编码
pcm_alaw 表示使用 a-law 格式的 PCM 编码器,也可以使用 u-law 格式的 PCM 编码器,对应命令为 -acodec pcm_mulaw;
测试程序推送标准rtp音频流,ffplay播放
我们有时候需要测试我们自己写的程序发送的rtp音频流是否有问题,我们可以用ffplay来进行播放测试。
ffplay播放rtp流时,需要播放sdp文件,sdp文件格式内容如:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=是忧伤还是快乐
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 58.40.100
m=audio 7008 RTP/AVP 97
b=AS:705
a=rtpmap:97 PCMA/8000/1
sdp文件里的配置要跟实际的推送的rtp流内容匹配上,才能正常播放,主要的配置说明:
文件里的127.0.0.1为推流方的IP,经实测,直接填写127.0.0.1也不影响播放
PCMA指的的解析流内容为g711a编码的pcm流,如果是g711u编码的,则要改为PCMU
我们程序的发流步骤为:创建rtp客户端→设置推流目标IP和端口→采集pcm数据→g711编码→发送