音频转换出错

时间:2022-01-11 08:40:29
同一段代码,为什么我将s16p转换成s16没有问题;将s16p转换成fltp的话,swr_convert就会崩溃,返回值和错误log都没有。
(gdb) bt
#0  0xb71d96bc in ?? () from /usr/local/lib/libswresample.so.0
#1  0xb71dab7a in ?? () from /usr/local/lib/libswresample.so.0
#2  0xb71e1f2f in ?? () from /usr/local/lib/libswresample.so.0
#3  0xb71e286f in swr_convert () from /usr/local/lib/libswresample.so.0
#4  0x08049bf3 in AudioDecoder::doDecode (this=0xbfffafa0) at ../AudioDecoder.cpp:178
#5  0x080496fb in AudioDecoder::read (this=0xbfffafa0, data=0x80b6600 "", len=16384)
    at ../AudioDecoder.cpp:108

int AudioDecoder::doDecode()
{
AVPacket pkt;
AVPacket * packet = &pkt;
int decoded_size = 0;
int got_frame = 0;
int ret;
AVFrame * mFrame = NULL;

if (!mFrame) {
mFrame = av_frame_alloc();
}
avcodec_get_frame_defaults(mFrame);
while (1) {
if (mPacketSize > 0) {
ret = avcodec_decode_audio4(mCodecCtx, mFrame, &got_frame, packet);
if (ret < 0) {
av_log(mCodec, AV_LOG_ERROR, "decode audio failed: %s.\n", av_err2str(ret));
continue;
}

if (!got_frame) {
mPacketSize = 0;
continue;
}

mPacketSize -= ret;
decoded_size = av_samples_get_buffer_size(NULL, mCodecCtx->channels,
mFrame->nb_samples, (enum AVSampleFormat)mFrame->format, 1);
if (mChannelLayout != mOutChannelLayout ||
mSampleFmt != mOutSampleFmt ||
mSampleRate != mOutSampleRate)
{
if (!mSwrCtx) {
mSwrCtx = swr_alloc_set_opts(mSwrCtx, mOutChannelLayout, mOutSampleFmt,
mOutSampleRate, mChannelLayout, mSampleFmt, mSampleRate, 0, NULL);
}
int err = swr_init(mSwrCtx);
if (err < 0) {
av_log(NULL, AV_LOG_ERROR, "swr init failed: %s.\n", av_err2str(err));
exit(1);
}
uint8_t * out[] = { mData };
int out_count = sizeof(mData) / av_get_channel_layout_nb_channels(mOutChannelLayout) /
av_get_bytes_per_sample(mSampleFmt);
err = swr_convert(mSwrCtx, out, out_count, (const uint8_t **)mFrame->extended_data,
mFrame->nb_samples);
if (err < 0) {
av_log(NULL, AV_LOG_ERROR, "swr convert failed: %s.\n", av_err2str(err));
exit(1);
}
decoded_size = err * av_get_channel_layout_nb_channels(mOutChannelLayout) *
av_get_bytes_per_sample(mOutSampleFmt);
mAudioBuffer = mData;
if (err == out_count) {
av_log(NULL, AV_LOG_INFO, "audio buffer too small.\n");
}
} else {
mAudioBuffer = mFrame->data[0];
}
return decoded_size;
}

ret = av_read_frame(mFmtCtx, packet);
if (ret < 0) {
fprintf(stdout, "read packet failed: %s.\n", av_err2str(ret));
}
if (packet->stream_index != mStreamIndex) {
continue;
}
mPacketSize += packet->size;
}
}

1 个解决方案

#1


我说的转换是指在  swr_alloc_set_opts(...)的参数 in_sample_fmt和out_sample_fmt。

#1


我说的转换是指在  swr_alloc_set_opts(...)的参数 in_sample_fmt和out_sample_fmt。