从ALSA读取帧时如何设置采样率[FFMPEG C/C++]

iswrvxsc  于 2023-07-01  发布在  C/C++
关注(0)|答案(1)|浏览(246)

我正在尝试使用ALSA从麦克风获取音频数据。默认情况下,流的采样率为4100 Hz,但我需要获得8000 Hz
尝试使用avformat_open_inputAVDictionary选项不会改变任何内容。
代码已最大程度简化:

AVFormatContext *format_context = nullptr;
AVInputFormat   *input_format   = nullptr;

avdevice_register_all();

input_format = av_find_input_format("alsa");

AVDictionary* options = NULL;
av_dict_set(&options, "sample_rate", "8000", 0);

int res = avformat_open_input(&format_context, "hw:0", input_format, &options);

if(res < 0)
{
    exit(1);
}

res = avformat_find_stream_info(format_context, 0);

if(res < 0)
{
    exit(1);
}

av_dump_format(format_context, 0, "alsa", 0);

输入#0,alsa,来自'alsa':持续时间:N/A,开始时间:1685994324.766645,码率:1411 kb/s流#0:0:音频:pcm_s16le,44100 Hz,2声道,s16,1411 kb/s
有没有什么方法可以让ALSA输出更低的采样率?
谢谢!

r6l8ljro

r6l8ljro1#

我没有使用ALSA的经验,也没有访问ALSA设备的权限,但我查看了libavdevice/asla_dec.clibavdevice/asla.clibavdevice/alsa.h的源代码。
我在libavdevice/asla_dec.c中遇到了这些行。

static const AVOption options[] = {
    { "sample_rate", "", offsetof(AlsaData, sample_rate), AV_OPT_TYPE_INT, {.i64 = 48000}, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
    { "channels",    "", offsetof(AlsaData, channels),    AV_OPT_TYPE_INT, {.i64 = 2},     1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
    { NULL },
};

因此,在我的FFmpeg版本中,snd_pcm_hw_params_set_rate_near的默认sample_rate是48000。
在我的MacOS机器上,我发现相应的文件libavdevice/avfoundation.mlibavdevice/audiotoolbox.m甚至没有给予sample_rate(!),并且我在avfoundation上尝试更改采样率时没有成功。至少ALSA似乎为您提供了设置sample_rate的选项,因此您实际上可能能够更改sample_rate

相关问题