Android音视频学习(五) — FFmpeg常用的命令(RTSP / RTMP的推流和拉流,结合MediaMtx处理)

109 阅读6分钟

一、编译的系统环境和FFmpeg的版本还有MediaMtx的版本

系统:MacOS 15.1
FFmpeg 版本:7.1.1

系统:Linux Ubuntu 20.04.6 LTS
Mediamtx 版本:1.13.0
下载地址: Mediamtx下载版本,可以根据自己的系统进行下载
这里作为推流的服务器使用




二、RTMP 和 RTSP 链接测试

推流的视频: 找一个自己喜欢的,建议视频的时间大一点的
拉流的链接: rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid(貌似是个游戏直播) rtsp://stream.strba.sk:1935/strba/VYHLAD_JAZERO.stream (慢,可能需要科学上网) 也可以根据自己的需要替换


Mediamtx 服务器的推流链接,根据自己的当前环境进行修改: rtmp://localhost:1935/my_camera rtsp://localhost:8554/my_camera


可以使用FFmpeg 或者 VLC软件进行对 RTMP 和 RTSP 链接进行测试

FFmpeg命令如下:

ffplay rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid -hide_banner
ffplay rtsp://stream.strba.sk:1935/strba/VYHLAD_JAZERO.stream -hide_banner

VLC测试工具如下:

vlc测试




二、Mediamtx 的下载,安装和启动

注意这里:这里使用Mediamtx 服务器作为测试参考,而且使用本地环境作为测试,需要在同一个局域网里面进行,需要线上的需要自己进行部署或者使用其他。这里用Mediamtx的版本是基于Linux系统的,其他可以根据自己的系统进行下载。

1. mediamtx进行解压缩

使用命令如下:

tar -xvf mediamtx_v1.13.0_linux_amd64. tar

mediamtx解压文件

解压成功后,有三个文件,如下图:
mediamtx解压结果

2. 编辑 mediamtx.yml 文件

  record: yes //这里设置为yes,可以记录并且保存流到本地
  paths:
     my_camera: {}  //这里是设置推拉流的路径,可以自行进行修改根据自己的要求



3. 启动 mediamtx 服务

使用的命令如下,在当前的目录下:

./mediamtx

启动 mediamtx 服务




三、FFmpeg高级命令 ----- 使用 RTMP 推流和拉流

注意这里:Mac和Windows和Linux的录制命令不一样,这里用Mac的作为参考,如果需要Windows和Linux的,请去参考 Windows和Linux的屏幕录制命令

1. 使用 RTMP 进行推流 , 结合 Mediamtx 一起进行交互

1-1. 使用 RTMP 对Mac摄像头 进行推流

相关的参数:
-f avfoundatio: 使用 AVFoundation 采集设备(仅 macOS)
-framerate 30: 设置帧率为 30 fps
-i "0:0" : 选择输入设备(摄像头和麦克风) ,"0:0" 指第一个视频和第一个音频设备
-c:v libx264: 使用 x264 编码视频
-f flv 指定输出格式为 FLV(RTMP 要求)


可选择的参数:
-hide_banner: 隐藏 FFmpeg 的 banner 信息, 让日志可以输出显示更加的清晰


Mac 摄像头 进行推流的命令:

ffmpeg -f avfoundation -framerate 30 -i "0:0" -c:v libx264 -f flv rtmp://192.168.31.81:1935/my_camera -hide_banner

rtmp推流命令 使用 ctrl + c 暂停进行推流


Mediamtx 服务器接收的命令如下,并且会创建recordings/my_camera 文件夹保存视频流

mediamtx服务器 视频流文件


1-2. 使用 RTMP 对本地视频 进行推流

视频文件自己替换为自己需要的

相关的参数:
-re: 以实时速度读取输入(适用于本地文件推流时模拟直播)
-c:v libx264: 使用 x264 编码视频
-c:a aac: 使用 AAC 编码音频
-f flv: 指定输出格式为 FLV(RTMP 要求)

命令如下:

ffmpeg -re -i yaya.mp4 -c:v libx264 -c:a aac -f flv rtmp://192.168.31.81:1935/my_camera -hide_banner

可选择的参数: -hide_banner 隐藏 FFmpeg 的 banner 信息, 让日志可以输出显示更加的清晰 rtmp推流命令

使用 ctrl + c 暂停进行推流


Mediamtx 服务器接收的命令如下,并且会创建recordings/my_camera 文件夹保存视频流 mediamtx服务器 视频流文件



2、使用 RTMP 进行拉流,并且保存视频文件到本地

使用到的rtmp链接: rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid(貌似是个游戏直播) 也可以根据自己的需要替换


相关的参数:
-c copy: 拷贝编码,不进行转码(快、节省 CPU)
-f mp4: 指定输出格式(也可以用 .flv, .ts)


可选择的参数: -hide_banner 隐藏 FFmpeg 的 banner 信息, 让日志可以输出显示更加的清晰


ffmpeg -i rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid -c copy -f mp4 saved_output_rtmp.mp4 -hide_banner

rtmp拉流

使用 ctrl + c 暂停进行拉流




四、FFmpeg高级命令 ----- 使用 RTSP 推流和拉流

注意这里:Mac和Windows和Linux的录制命令不一样,这里用Mac的作为参考,如果需要Windows和Linux的,请去参考 Windows和Linux的屏幕录制命令

1. 使用 RTSP 进行推流, 结合 Mediamtx 一起进行交互

1-1. 使用 RTSP 对Mac摄像头 进行推流

相关的参数:
-fflags +genpts: 为每个帧强制生成 PTS 时间戳,防止推流时出现 “Non-monotonic DTS” 报错
-f avfoundatio: 使用 AVFoundation 采集设备(仅 macOS)
-framerate 30: 设置帧率为 30 fps
-i "0:0" : 选择输入设备(摄像头和麦克风) ,"0:0" 指第一个视频和第一个音频设备
-c:v libx264: 使用 x264 编码视频
-c:a aac: 使用 AAC 编码音频
-f rtsp: 使用 RTSP 封装格式输出


可选择的参数:
-ar 44100: 设置音频采样率为 44100Hz
-ac 2: 设置音频声道为立体声
-hide_banner 隐藏 FFmpeg 的 banner 信息, 让日志可以输出显示更加的清晰


ffmpeg -fflags +genpts -f avfoundation -framerate 30 -i "0:0" -c:v libx264 -c:a aac -ar 44100 -ac 2 -f rtsp rtsp://192.168.31.81:8554/my_camera -hide_banner

使用 RTSP 对Mac摄像头 进行推流


mediamtx服务器


视频流文件


1-2. 使用 RTSP 对本地视频 进行推流

视频文件自己替换为自己需要的

相关的参数: -re: 以实时速度读取输入(适用于本地文件推流时模拟直播) -c:v libx264: 使用 x264 编码视频 -c:a aac: 使用 AAC 编码音频 -f rtsp: 使用 RTSP 封装格式输出


可选择的参数: -hide_banner 隐藏 FFmpeg 的 banner 信息, 让日志可以输出显示更加的清晰


ffmpeg -re -i yaya.mp4 -c:v libx264 -c:a aac -f rtsp rtsp://192.168.31.81:8554/my_camera -hide_banner

rtsp视频推流 mediamtx服务器 视频流文件



2、使用 RTSP 进行拉流,并且保存视频文件到本地

使用到的rtsp链接: rtsp://stream.strba.sk:1935/strba/VYHLAD_JAZERO.stream (慢,可能需要科学上网) 也可以根据自己的需要替换


相关的参数:
-rtsp_transport tcp: 强制使用 TCP 拉流,更稳定,避免 UDP 丢包
-c copy: 音视频直接拷贝,不重新编码,速度快、资源低
-f mpegts: 这里保存为ts格式,因为ts格式比较稳定,如果需要其他格式的可以自行修改

可选择的参数:
-hide_banner:隐藏 FFmpeg 的 banner 信息, 让日志可以输出显示更加的清晰

ffmpeg -rtsp_transport tcp -i rtsp://stream.strba.sk:1935/strba/VYHLAD_JAZERO.stream -c copy -f mpegts saved_video_rtsp.ts -hide_banner

RTSP拉流 使用 ctrl + c 暂停进行拉流




五、更多FFmpeg查询命令链接地址

上面部分命令的参数可以按照自己的需求去进行添加或者修改。 上面的环境是推流和拉流的环境是Mac系统环境,需要使用Window或者Linux的,请自行查询对应的文档修改参数。 上面知识列举了部分的命令,如果没有合适的话,可以根据自己的需求到该网址进行查询并使用。 FFmpeg文档地址