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



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样本。此处编码。通过进一步探究源代码,编解码器值来自AVFormatContext::audio_dec_id struct字段。

现在,我发现PyAV使用Cython来使用FFmpeg,并通过阅读Container类的PyAV源代码,我注意到它在self.ptr变量中包含AVFormatContext。然后阅读InputContainer源代码,尤其是在调用avformat_open_input函数打开alsa设备之前。PyAV不支持指定使用的音频编解码器。

我分叉了库,很快就为我破解了解决方案。现在的问题是,是否有可能将此功能添加到PyAV中,以强制使用音频所用的编解码器?在这种情况下,当设备使用pcm采样并依赖ffmpeg来使用时,请选择默认值,它将始终使用16位采样,在我的情况下,我需要使用32位采样。

希望这能帮助到一些人,并为他们省去我所经历的麻烦:(我也在这里发布了PyAV问题的相同答案。

相关内容

  • 没有找到相关文章

最新更新