我正在编写一个简单的程序,使用 libav 将任何输入音频文件解码为 pcm16/mono/wav 文件。或者,我认为这很简单。
经过一番努力,阅读了大量示例代码(如 avconv/avplay),我设法编写了一些应该可以工作的代码。
但是,它不起作用。解复用/解码部分似乎工作正常,但编码部分失败并显示以下消息:
mathematics.c:61: av_rescale_rnd: Assertion `c > 0' failed.
这是代码摘录:
printf("Fill Frame\n");
avcodec_fill_audio_frame(oframe, _oCodecCtx->channels, _oCodecCtx->sample_fmt, frame->data[0], frame->linesize[0], 0);
printf("Frame filled\n");
ret = avcodec_encode_audio2(_oCodecCtx, &opkt, oframe, &got_packet);
if (ret < 0) {
printf("Error encoding audio frame\n");
return 1;
}
错误出现前会显示“Fill Frame”和“Framefilled”。所以,我认为它是由avcodec_encode_audio2
. 但是,此函数不会av_rescale_rnd
在其源代码中调用。
那么问题来了:有没有办法知道是谁调用了这个函数,而无需修改/重新编译 libav 源代码?