Leon C. 2022-07-18 15:00 采纳率: 0%
浏览 93
已结题

如何使用FFmpeg仅列出音频输入设备?

我正在使用 FFmpeg 5.0.1 做一个音频录制项目。 为了列出所有可用的音频输入设备供用户选择和使用,我使用了函数avdevice_list_input_sources()。 我的代码如下:

avdevice_list_input_sources(av_find_input_format("dshow"), NULL, NULL, &device_list);

其中device_list声明为:

AVDeviceInfoList* device_list;

但是这样一来,所有支持的输入设备,包括音频和视频,都会列出来。 这可能会损害程序的稳定性,因为用户可能会选择列出的视频设备并导致程序崩溃。 所以我需要找到一种只列出音频输入设备或从device_list中删除视频设备的方法。 但到目前为止,我还没有找到可行的办法。

请问怎样只列出音频设备或从device_list中删除音频设备?

谢谢!

  • 写回答

1条回答 默认 最新

  • m0_72929209 2022-07-23 16:48
    关注

    1.视频和音频单独抓取
    如果指定输入格式和设备,则ffmpeg可以直接捕获视频和音频。

    Linux下捕获摄像头的数据保存成视频文件:

    ffmpeg -f video4linux2 -s 1280x720 -i /dev/video0 test.mp4

    参数介绍:

    -s 指定摄像头输出的图像尺寸

    -i 摄像头的设备节点

    test.mp4 是保存的视频文件名称

    -f video4linux2是指定框架

    1. Linux下捕获声卡的数据保存成音频文件:

    (1)# ffmpeg -f alsa -ac 2 -ar 44100 -i default out.wav
    参数介绍:
    -i 指定声卡设备名称。这里default表示选择默认声卡。
    out.wav 捕获的音频数据保存的文件名称
    -f 是指定音频驱动类型。alsa是linux下音频驱动框架。oss是另外一种音频框架。
    -ar 设置音频采样率,以HZ为单位
    -ac 设置音频通道数(单声道、双声道)
    (2)# ffmpeg -f alsa -ac 1 -ar 44100 -i default -t 30 out.wav
    参数介绍:
    -t 30 表示录制30秒就自动停止

    (3)# ffmpeg -f alsa -ac 1 -ar 16000 -i hw:0 -t 10 out.wav
    参数介绍:
    这里的hw:0 也表示选择默认的声卡设备录音。
    列出当前主机上的声卡设备:

    [root@wbyq linux-share-dir]# arecord -l (列出声卡设备数量)
    **** List of CAPTURE Hardware Devices ****
    card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    card 1: U0x46d0x825 [USB Device 0x46d:0x825], device 0: USB Audio [USB Audio]
    Subdevices: 0/1
    Subdevice #0: subdevice #0

    [root@wbyq linux-share-dir]# arecord -L (列出声卡设备详细信息)
    default
    Default
    front:CARD=AudioPCI,DEV=0
    Ensoniq AudioPCI, ES1371 DAC2/ADC
    Front speakers
    surround40:CARD=AudioPCI,DEV=0
    Ensoniq AudioPCI, ES1371 DAC2/ADC
    4.0 Surround output to Front and Rear speakers
    iec958:CARD=AudioPCI,DEV=0
    Ensoniq AudioPCI, ES1371 DAC2/ADC
    IEC958 (S/PDIF) Digital Audio Output
    front:CARD=U0x46d0x825,DEV=0
    USB Device 0x46d:0x825, USB Audio
    Front speakers
    surround40:CARD=U0x46d0x825,DEV=0
    USB Device 0x46d:0x825, USB Audio
    4.0 Surround output to Front and Rear speakers
    surround41:CARD=U0x46d0x825,DEV=0
    USB Device 0x46d:0x825, USB Audio
    4.1 Surround output to Front, Rear and Subwoofer speakers
    surround50:CARD=U0x46d0x825,DEV=0
    USB Device 0x46d:0x825, USB Audio
    5.0 Surround output to Front, Center and Rear speakers
    surround51:CARD=U0x46d0x825,DEV=0
    USB Device 0x46d:0x825, USB Audio
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
    surround71:CARD=U0x46d0x825,DEV=0
    USB Device 0x46d:0x825, USB Audio
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
    iec958:CARD=U0x46d0x825,DEV=0
    USB Device 0x46d:0x825, USB Audio
    IEC958 (S/PDIF) Digital Audio Output
    使用arecord -L命令列出了声卡名字之后,就可以选择指定声卡录制声音,其中front:xxx 就是声卡的名字。

    选择指定的声卡录制声音示例:

    (1). 选择USB摄像头的音频设备录音

    ffmpeg -f alsa -ac 1 -ar 44100 -i front:CARD=U0x46d0x825,DEV=0 -t 10 out.wav

    (2). 选择电脑自带的声卡录音

    ffmpeg -f alsa -ac 1 -ar 44100 -i front:CARD=AudioPCI,DEV=0 -t 10 out.wav

    FFMPEG录制音频的其他参数:

    ffmpeg --help

    音频选项:
    -aframes number 设置要输出的音频帧数
    -aq quality 设置音频质量(特定于编解码器)
    -ar rate 设置音频采样率(以Hz为单位)
    -ac channel 设置音频通道数
    -an 禁用音频
    -acodec codec 强制音频编解码器复制到流
    -vol volume 更改音频音量(256=正常)
    -af filter_graph 设置音频过滤器
    录制带声音的视频
    命令示例:

    #ffmpeg -f alsa -ac 1 -ar 44100 -i front:CARD=U0x46d0x825,DEV=0 -f video4linux2 -i /dev/video0 out.mpg

    #ffmpeg -f alsa -ac 1 -ar 16000 -i front:CARD=U0x46d0x825,DEV=0 -f video4linux2 -i /dev/video0 out.mp4
    录制MP4格式的视频时,音频采样率设置16000效果比较好一些。

    采用MP4格式录制视频的详细信息(视频H264、音频AAC):

    Output #0, mp4, to 'out.mp4':
    Metadata:
    encoder : Lavf57.25.100
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 640x480, q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
    encoder : Lavc57.24.102 libx264
    Side data:
    unknown side data type 10 (24 bytes)
    Stream #0:1: Audio: aac (LC) ([64][0][0][0] / 0x0040), 16000 Hz, mono, fltp, 69 kb/s
    Metadata:
    encoder : Lavc57.24.102 aac
    Stream mapping:
    Stream #1:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
    Stream #0:0 -> #0:1 (pcm_s16le (native) -> aac (native))
    采用MPG格式录制视频的详细信息(视频mpeg1video、音频mp2):

    Output #0, mpeg, to 'out.mpg':
    Metadata:
    encoder : Lavf57.25.100
    Stream #0:0: Video: mpeg1video, yuv420p, 640x480, q=2-31, 200 kb/s, 30 fps, 90k tbn, 30 tbc
    Metadata:
    encoder : Lavc57.24.102 mpeg1video
    Side data:
    unknown side data type 10 (24 bytes)
    Stream #0:1: Audio: mp2, 48000 Hz, mono, s16, 384 kb/s
    Metadata:
    encoder : Lavc57.24.102 mp2
    Stream mapping:
    Stream #1:0 -> #0:0 (rawvideo (native) -> mpeg1video (native))
    Stream #0:0 -> #0:1 (pcm_s16le (native) -> mp2 (native)

    评论

报告相同问题?

问题事件

  • 系统已结题 7月27日
  • 赞助了问题酬金5元 7月19日
  • 修改了问题 7月18日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真