remuxing.c 解读
*****************************************
这是一个控制在AVFormatContext 下的程序,
相较muxing.c, 省略了get_frame 形成frame, 再send_frame,receive_packet的过程. 代之以直接av_read_frame得到包.
就是简单改一下文件后缀的意思, 把包读进来, 不解码,直接再写包到文件.
具体流程分析:
一个输入format_context(ifmt_ctx),
一个输出format_context(ofmt_ctx).
AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
两个fromat之间需要建立一个stream_mapping, 就是流之间的对应关系,
当然是音频对音频,视频对视频了,这里用index 建立关联. 并给ofmt_ctx 添加流
后面是打开输出文件(若必要),
ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
写文件头部,
ret = avformat_write_header(ofmt_ctx, NULL);
写数据包就可以了. (直接copy)
ret = av_read_frame(ifmt_ctx, &pkt);
pkt.stream_index = stream_mapping[pkt.stream_index];
pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
结束:
av_write_trailer(ofmt_ctx);
avformat_close_input(&ifmt_ctx);
if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE)) avio_closep(&ofmt_ctx->pb);
avformat_free_context(ofmt_ctx);
av_freep(&stream_mapping);