首页 > 解决方案 > av_read_frame() 时出现分段错误

问题描述

我有一个媒体文件并将输入分配给上下文结构

typedef struct _contexts_{
    AVFormatContext *format_ctx;
    AVCodecContext  *audio_codec_ctx;
    AVCodec         *audio_codec;
    int     audio_stream_index;
}contexts;

我正在发送一个包含 1 个视频和 3 个音频流的输入文件。我只需要对音频流进行一些操作。我试图复制流并分配一个新的上下文结构。我读取了输入文件并将值 nb_streams 移动到 audio_streams。以下是我尝试过的复制逻辑。

/*Reading input file 
..........
..........
*/
    contexts mctx[audio_streams];
    AVCodecParameters *param;
    AVStream *stream;
    AVCodecContext *avctx[audio_streams];
    for(i=0; i<audio_streams; i++){
            param = avcodec_parameters_alloc();
            mctx[i].audio_codec = avcodec_find_decoder(AV_CODEC_ID_AC3);
            mctx[i].format_ctx = (AVFormatContext *)avformat_alloc_context();
            mctx[i].audio_codec_ctx  = (AVCodecContext *)avcodec_alloc_context3(mctx[i].audio_codec);
            stream = avformat_new_stream(mctx[i].format_ctx,mctx[i].audio_codec_ctx->codec);
            avcodec_parameters_from_context(param,stream->codec);
            avcodec_parameters_to_context(mctx[i].audio_codec_ctx,param);
            mctx[i].format_ctx->streams[0] = context_data.format_ctx->streams[i+1];
            avcodec_parameters_free(&param);
            mctx[i].audio_stream_index = i;
    }

后来我做了以下

AVPacket packet;
av_init_packet(&packet);
int pkt_index = 0;

for(i=0; i < audio_streams;i++)
while((av_read_frame(mctx[i].format_ctx, &packet) >= 0)){
.........

我在这个 av_read_frame() 处得到了分段错误,此时它正在退出。我的问题是

  1. 我是否正确完成了复制?如果是,为什么我会收到错误,如果否,
  2. 如何将流分别分配给上下文结构?

任何建议或建议都会有所帮助,谢谢。

标签: cffmpegsegmentation-faultlibavlibavcodec

解决方案


推荐阅读