FFmpeg的封装格式处理:视音频的分离器(Demuxer)

本文详细介绍了FFmpeg在处理H264码流时的封装格式处理,包括MPEG2TS与FLV、MP4等复用格式的区别。在分离H264视频码流时,需要添加SPS、PPS信息和起始码,而对于音频AAC码流,MP3可以直接存储,而FLV等格式则需添加ADTS头。此外,还提到了简单分离器与非简化版视音频分离器(demuxer)的工作原理。
分离做法:直接输出解复用之后的的音频数据码流。
只需要在每次调用av_read_frame()之后将得到的音视频的AVPacket
【纯数据,如视频不包括SPS、PPS。不包括start_code,如音频不包括7字节ADTS】
存为本地文件即可
视目标格式对其进行添加相关结构

在这里插入图片描述

区别:
1.在分离视频码流的时候
 如MPEG2TS封装的H264:直接存储AVPacket即可
 而复用格式是(FLV, MP4, MKV etc.)封装的H264 则不行:
   ①在前面加上H.264的SPS和PPS。这些信息存储在AVCodecContext的extradata里面,然后才能写入文件
   ②要添加分隔符(0x00000001),否则就不是标准的nalu【AVPacket前4个字预留了分隔符的空间,第5个字节开始才是nalu的数据→直接将AVPacket前4个字节替换为0x00000001即可得到标准的nalu数据。】

2.在分离音频AAC码流
    ①MP3,直接存储AVPacket即可
    ②复用格式是(FLV, MP4, MKV etc.) 等需要在每个AVPacket前加上7字节ADTS文件头→→即可播放

h264添加sps pps startcode的封装处理:

使用bitstream filter处理每个AVPacket
效果:
 每个AVPacket的data添加了H.264的NALU的起始码{0,0,0,1}
 每个IDR帧数据前面添加了SPS和PPS

AVBitStreamFilterContext* h264bsfc =  av_bitstream_filter_init("h264_mp4toannexb"); ----1.初始化
while(av_read_frame(ifmt_ctx, &pkt)>=0){
   
   
	if(pkt.stream_index==videoindex){
   
   
		av_bitstream_filter_filter(h264bsfc, ifmt_ctx->streams[videoindex]->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);--------2.处理
		fwrite(pkt.data,1,pkt.size,fp_video);
	}
	av_free_packet(&pkt);//释放数据但不是放空间  另一个则是直接释放空间👉再用再申请
}
av_bitstream_filter_close(h264bsfc);  --------3.销毁

简单分离器:

在这里插入图片描述

AVFormatContext *ifmt_ctx = NULL;
AVPacket pkt;
int ret, i;
int videoindex=-1,audioindex=-1;
const char *in_filename  = "cuc_ieschool.flv";//Input file URL
const char *out_filename_v = "cuc_ieschool.h264";//Output file URL
const char *out_filename_a = "cuc_ieschool.mp3";

av_register_all();
avformat_open_input(&ifmt_ctx, in_filename, 0, 0)
avformat_find_stream_info(ifmt_ctx, 0)</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值