如何为FFplay指定音频输入以获取采集设备的音频?
如何为FFplay指定音频输入以获取采集设备的音频?
嗨,我来帮你解决这个问题~你遇到的报错是因为FFplay默认会把命令行里额外的设备路径当成第二个输入文件名,它没法直接处理这种“零散”的多输入写法,所以才会提示和/dev/video0冲突。
这里有两种靠谱的解决办法,你可以根据需求选择:
方法一:用FFmpeg做中间处理,通过管道传流给FFplay(兼容性最好)
这种方法是最稳妥的,毕竟FFmpeg天生擅长处理多输入源的混合,我们可以让它同时捕获视频和音频,再把处理好的流交给FFplay播放。命令如下:
ffmpeg -f v4l2 -framerate 60 -video_size 1280x720 -input_format mjpeg -i /dev/video0 -f alsa -i hw:1 -c:v copy -c:a aac -f matroska - | ffplay -
我给你拆解下逻辑:
- 前半段的
ffmpeg命令同时指定了两个输入:你的视频采集设备/dev/video0,以及音频采集设备hw:1 -c:v copy表示直接复制视频流,不用重新编码,能节省不少性能;-c:a aac把音频转成FFplay友好的AAC格式-f matroska -表示把混合后的音视频流封装成Matroska格式,然后输出到标准输出(-代表标准输出)- 最后用管道
|把这个流传给ffplay -,让FFplay读取标准输入的内容来播放
方法二:直接用FFplay的多输入+滤镜合并(适合新版本FFplay)
如果你的FFplay是比较新的版本,也可以直接让它处理双输入,然后用滤镜合并音视频流,命令是:
ffplay -f v4l2 -framerate 60 -video_size 1280x720 -input_format mjpeg -i /dev/video0 -f alsa -i hw:1 -filter_complex "[0:v][1:a]concat=n=1:v=1:a=1[v][a]" -map "[v]" -map "[a]"
简单说下作用:
- 用两次
-i分别指定视频和音频输入源 -filter_complex里的滤镜会把第一个输入的视频流(0:v)和第二个输入的音频流(1:a)合并成一套完整的音视频流- 最后用
-map指定FFplay播放合并后的流
额外小提示
- 可以先单独测试音频设备是否正常:用
ffplay -f alsa -i hw:1播放音频,确认设备能正常捕获声音 - 如果播放时出现音视频不同步的情况,可以在FFplay的命令里加上
-async 1参数来强制同步
备注:内容来源于stack exchange,提问作者Ken Mandelberg
相关产品推荐
相关产品推荐

