FFMPEG推流摄像头

一般的直播网站都使用OBS推流,其实ffmpeg也可以推流,在无界面环境下就可以推流使用。本文以Windows下为例,简单介绍下使用ffmpeg工具推流的方法和步骤。

下载安装

下载地址:https://ffmpeg.zeranoe.com/builds/

选择版本(默认即可),选择自己系统架构,Linking 选择 static,点击Download Build下载压缩包。解压bin目录的三个exe程序到任意目录

  • ffmpeg.exe ffmpeg主程序,转码工具
  • ffplay.exe 媒体播放工具,可播放本地视频以及网络视频
  • ffprobe.exe 媒体探测工具,可探测媒体信息,如编码信息等

CMD切换到 EXE 该目录即可使用。也可以将三个exe解压到系统 Windows 目录下,方便全局访问。

命令行推流

推流摄像头,首先需要本机有音视频采集设备,可通过查询本机音视频设备名称

ffmpeg.exe -list_devices true -f dshow -i dummy

查询后类似以下输出

[dshow @ 0496a480] DirectShow video devices
[dshow @ 0496a480] "USB2.0 PC CAMERA"
[dshow @ 0496a480] Alternative name "@device_pnp_\\?\usb#vid_1908..."
[dshow @ 0496a480] DirectShow audio devices
[dshow @ 0496a480] "楹﹀厠椋?(USB2.0 MIC)"
[dshow @ 0496a480] Alternative name "@device_cm_{33D9A762-90C8-...}"

注意上面的音频设备名称 楹﹀厠椋?(USB2.0 MIC) 乱码(字符编码不同导致,实为 ‘麦克风’ ),如果乱码可在设备管理器查询,最终可知当前机器的音视频设备名称为 USB2.0 PC CAMERA麦克风 (USB2.0 MIC)

使用上述设备进行推流,命令如下

ffmpeg -f dshow -i video="USB2.0 PC CAMERA":audio="麦克风 (USB2.0 MIC)" \
-vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1/live/test

不需要音频的命令如下

ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -vcodec libx264 \
-f flv rtmp://127.0.0.1/live/test

上述推流默认参数可能比较低,如果需要对某些参数进行配置优化,相应的命令行参数如下

  • -r 设置帧率,命令为 -r 25,全拼写为 -framerate 25
  • -s 设置分辨率,命令为 -s 640x480,全拼为 -video_size 640x480
  • -b 设置码率,命令为 -b 1M ,相当于1024kbps,全拼为 -bitrate 1M,可配置小数
    • 其中 -b:a 可单独设置音频 -b:v 可单独设置视频
  • -bufsize 设置码率控制缓冲器的大小 ,让码率非常平稳,如设置尽量与 -b 相同
    • 需要视频码流平稳的使用此参数,不需要设置 maxrateminrate
    • 同理,需要抖动的话设置 maxrateminrate,不需要设置 bufsize
  • -maxrate 可设置最大码率,可配置小数,如 -maxrate 1.5M
  • -minrate 可设置最小码率,可配置小数,如 -minrate 1.5M
  • -preset:v 视频H264配置参数,如 -preset:v ultrafast
  • -tune:v 视频H264配置参数,如 -tune:v zerolatency
  • -g 设置H264的GoP大小,即I帧间隔,如 -g 50

比如以25帧推送640x480分辨率的摄像头

ffmpeg -r 25 -f dshow -i video="USB2.0 PC CAMERA":audio="麦克风 (USB2.0 MIC)" \
-vcodec libx264 -s 640x480 -tune:v zerolatency \
-acodec aac -f flv rtmp://127.0.0.1/live/test

带控制码率(码率波动平稳)的命令行示例如下

ffmpeg -r 25 -f dshow -i video="USB2.0 PC CAMERA":audio="麦克风 (USB2.0 MIC)" \
-vcodec libx264 -b 1M -bufsize 1M -s 1280x720 -tune:v zerolatency \
-acodec aac -b:a 64k -f flv rtmp://127.0.0.1/live/test

其他

在推流时候,有时候设置自定义帧率后发现ffmpeg会产生大量警告,如

Past duration 0.xxxxx too large

出现这种现象只需要将指定帧率的命令放到设备之前,如 ffmpeg.exe -r 25 -fdshow -i ...

最近的文章

CentOS7配置SRS服务及日志

最近将RTMP服务器转移到Linux平台下,同时也想使用下SRS服务器。但是SRS默认只提供了CentOS 6的RPM安装包,其他平台需自己编译,同时SRS也只提供了SysV方式的服务脚本,故在systemd架构下需要自己开发相对应的脚本,以下记录下本人在CentOS 7上安装配置SRS。 编译SR …

技术 继续阅读
更早的文章

使用内存映射实现本地缓存

本来程序中一些数据需要在下次重启后能够恢复继续使用,一般比较好的办法是直接嵌入sqlite数据库或者嵌入leveldb,但是需要引入第三方库,略麻烦,因此打算自己实现。 实现思路自己实现最简单就是使用WinAPI操作INI文件,一个读API一个写API,非常简单方便,但是曾经出现过一个项被写两次的问 …

技术 继续阅读