流相关

- 本地文件推流

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

参考

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 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流内容匹配上,才能正常播放,主要的配置说明:
9824899601d722372d90884eb76186d-1694240836357

文件里的127.0.0.1为推流方的IP,经实测,直接填写127.0.0.1也不影响播放
PCMA指的的解析流内容为g711a编码的pcm流,如果是g711u编码的,则要改为PCMU

我们程序的发流步骤为:创建rtp客户端→设置推流目标IP和端口→采集pcm数据→g711编码→发送