remuxing.c 解读

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值