c - 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(¶m);
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() 处得到了分段错误,此时它正在退出。我的问题是
- 我是否正确完成了复制?如果是,为什么我会收到错误,如果否,
- 如何将流分别分配给上下文结构?
任何建议或建议都会有所帮助,谢谢。
解决方案
推荐阅读
- python - 如何自动打开带有时间戳的 Tera Term
- javascript - 有没有办法将动态生成的字幕加入视频以使其永久化,以便用户可以下载带有字幕的视频?
- json - 如何将Json中的日期转换为正常日期以检查它是否是GoLang中的闰年?
- html - 如何在 Web 表单中选择基于 html 的文件上传器的(输入类型 =“文件”)文件作为 asp:net FileUpload?
- material-ui - 无论如何将Material UI Tabs设置为默认未选择?
- docker - Postman 向 Eclipse-SUMO Docker 映像传递参数
- c# - “CefSharp.Core.Runtime.dll”最终出现在我的“bin”文件夹中,而不仅仅是“bin\x86”
- r - 尝试在 Linux 上使用 19C 客户端通过 DBI 将 R 连接到 Oracle 数据库时失败
- compression - 在时间冗余压缩中,当前要发送的帧和前一帧之间的差异究竟是什么意思?
- laravel-8 - BadMethodCallException 调用未定义的方法 App\Models\BatterFirst::index()