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

Leon C. 2022-07-19 14:05:44

我正在使用 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中删除音频设备?

谢谢!

...全文
661 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hulehui 2023-03-18
  • 打赏
  • 举报
回复


```c
#include <stdio.h>  
  
AVInputFormat* find_input_format(AVInputFormat* input_format) {  
    if (input_format == NULL) {  
        return NULL;  
    }  
    for (int i = 0; i < input_format->nb_streams; i++) {  
        if (input_format->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {  
            return input_format;  
        }  
    }  
    return NULL;  
}  
  
AVStream* find_input_stream(AVStream* input_stream) {  
    if (input_stream == NULL) {  
        return NULL;  
    }  
    for (int i = 0; i < input_stream->nb_streams; i++) {  
        if (input_stream->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {  
            return input_stream;  
        }  
    }  
    return NULL;  
}  
  
AVStream* find_output_stream(AVStream* output_stream) {  
    if (output_stream == NULL) {  
        return NULL;  
    }  
    for (int i = 0; i < output_stream->nb_streams; i++) {  
        if (output_stream->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {  
            return output_stream;  
        }  
    }  
    return NULL;  
}  
  
int main() {  
    AVInputFormat* input_format = find_input_format(AVInputFormat::AUDIO);  
    AVStream* input_stream = find_input_stream(AVStream::AUDIO);  
    AV

```

CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-IT工具 发布问题, 以便更快地解决您的疑问
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。 解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。 解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。 视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。 接下来的几节我们将会列出主要的流媒体协议,封装格式,以及视音频编码标准。更详细的比较可以参考: 视频参数(流媒体系统,封装格式,视频编码,音频编码,播放器)对比 有关本文中涉及到的协议数据、封装格式数据、视频编码数据、音频编码数据、视频像素数据、音频采样数据的分析可以参考下面系列文章:

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧