我有16位PCM数据和立体声设置,我从麦克风上抓取。
获取数据后,我使用以下编码器设置对其进行编码
AVCodec* audio_codec = avcodec_find_encoder(AV_CODEC_ID_MP2);
AVCodecContext* audio_codec_ctx = avcodec_alloc_context3(audio_codec);
audio_codec_ctx->bit_rate = 64000;
audio_codec_ctx->channels = 2;
audio_codec_ctx->channel_layout = AV_CH_LAYOUT_STEREO;
audio_codec_ctx->sample_rate = 44100;
audio_codec_ctx->sample_fmt = AV_SAMPLE_FMT_S16;
当我将音频数据传递到编码器时,我发现每次需要4608个字节的数据,并将其正确编码为MP2数据。麦克风抓取的PCM数据为88320字节,编码器每次占用4608字节并进行压缩。
如果我将已经编码的每个4608字节部分传递给解码器并使用与上述相同的设置但是使用解码器。
AVCodecID audio_codec_id = AV_CODEC_ID_MP2;
AVCodec * audio_decodec = avcodec_find_decoder(audio_codec_id);
audio_decodecContext = avcodec_alloc_context3(audio_decodec);
audio_decodecContext->bit_rate = 64000;
audio_decodecContext->channels = 2;
audio_decodecContext->channel_layout = AV_CH_LAYOUT_STEREO;
audio_decodecContext->sample_rate = 44100;
audio_decodecContext->sample_fmt = AV_SAMPLE_FMT_S16;
解码工作并且成功但是当我查看数据大小时,它正好是编码的2034。我不明白为什么会这样。考虑到编码器和解码器是相同的,我会想象我会得到4608。
任何人都可以了解为什么会发生这种情况。我应该设置什么?
答案 0 :(得分:1)
应使用audio_decodecContext->request_sample_fmt
设置所请求的解码器样本格式。 sample_fmt
由解码器本身设置,可能不同,在这种情况下,您应该使用libswresample在样本格式之间进行转换。