PyAv av.open() 指定使用的编解码器

PyAv av.open() specify used codec

使用PyAv打开alsa音频设备时。我如何指定使用的编解码器而不是 ffmpeg 默认编解码器,因为那是错误的。默认情况下它将使用 pcm_s16le 而我需要使用 pcm_s32le。我可以使用以下 ffmpeg 命令从我的设备进行录制:

ffmpeg -f alsa -acodec pcm_s32le -i dmic_sv alsaout.wav

但没有

ffmpeg -f alsa -i dmic_sv alsaout.wav

这会给我以下错误:

[alsa @ 0x12061c0] cannot set sample format 0x10000 2 (Invalid argument)
dmic_sv: Input/output error

如何将工作命令传递给PyAv av.open()函数?有stream_options但是好像不行。我试过了

stream_options = [{'-acodec': 'pcm_s32le'}]
av.open('dmic_sv', format='alsa', mode='r', stream_options=stream_options)

我和上面的一样。

av.error.OSError: [Errno 5] Input/output error: 'dmic_sv'; last error log: [alsa] cannot set sample format 0x10000 2 (Invalid argument)

如何操作?

我会回答我自己的问题,因为我想通了。我阅读了 ffmpeg 源代码,发现当使用 alsa 音频设备并且未指定编解码器时,ffmpeg 将默认使用签名的 16 位 pcm 样本。代码 here. By further exploring the source code the codec value comes from AVFormatContext::audio_codec_id 结构字段。

现在通过阅读PyAV源码的Container class I noticed it holds AVFormatContext in it's self.ptr variable. Then reading InputContainer source code and especially before calling avformat_open_input功能,弄清楚了使用Cython的PyAV使用FFmpeg打开alsa设备。 PyAV 不支持指定使用的音频编解码器。

我分叉了库并很快结束了对我的 solution 的破解。现在的问题是是否可以将此功能添加到 PyAV 以强制使用用于音频的编解码器?在这种情况下,当设备使用 pcm 样本并依赖 ffmpeg 使用时,选择默认值,它将始终使用 16 位样本,而在我的情况下,我需要使用 32 位样本。

希望这对某人有所帮助,并为他们省去我遇到的麻烦 :) 我也针对 PyAV 问题发布了同样的答案 here