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问题的相同答案。