You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyAV创建AudioFrame报错:Unexpected numpy array shape (4800,2)求助

解决PyAV创建音频帧时的Shape不匹配错误

尝试使用PyAV创建音频帧时遇到报错,以下是自定义音频类代码:

class CustomAudioTrack(MediaStreamTrack):
    kind = "audio"

    def __init__(self, rate=48000, channels=2):
        super().__init__()
        self.rate = rate
        self.channels = channels
        self._timestamp = 0

    async def recv(self):
        # 录制0.1秒音频的帧数
        frames = int(self.rate / 10)
        data = sd.rec(frames, samplerate=self.rate,
                      channels=self.channels, dtype=np.int16)
        sd.wait()  # 等待录制完成

        # 更新时间戳
        self._timestamp += frames
        pts = self._timestamp
        time_base = fractions.Fraction(1, self.rate)

        # 创建音频帧
        audio_frame = av.AudioFrame.from_ndarray(
            data, format='s16', layout='stereo')
        audio_frame.sample_rate = self.rate
        audio_frame.pts = pts
        audio_frame.time_base = time_base

        return audio_frame

报错信息:

Traceback (most recent call last):
File "C:\Users\poppppp\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiortc\rtcrtpsender.py", line 328, in _run_rtp
enc_frame = await self._next_encoded_frame(codec)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\poppppp\AppData\Local\Programs\Python\Python311\Lib\site-packages\aiortc\rtcrtpsender.py", line 270, in _next_encoded_frame
data = await self.__track.recv()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\documents\project\pythonProject\webrtc_tutorial\sadda_python\offerer.py", line 44, in recv
audio_frame = av.AudioFrame.from_ndarray(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "av\audio\frame.pyx", line 125, in av.audio.frame.AudioFrame.from_ndarray
File "av\utils.pyx", line 79, in av.utils.check_ndarray_shape
ValueError: Unexpected numpy array shape (4800, 2)

解决方法

PyAV的AudioFrame.from_ndarray要求立体声数据的形状是**(通道数, 采样数),而当前从sd.rec得到的是(采样数, 通道数)**的形状(即(4800,2)),所以需要调整数组维度顺序:

方法一:对录制得到的data做转置处理

audio_frame = av.AudioFrame.from_ndarray(
    data.T, format='s16', layout='stereo')

方法二:调用sd.rec时指定channels_first=True,直接获取通道在前的数组

data = sd.rec(frames, samplerate=self.rate,
              channels=self.channels, dtype=np.int16, channels_first=True)

两种方法都能让数组形状符合PyAV的要求,解决该报错。

内容的提问来源于stack exchange,提问作者Ismael Hadj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:17:43