分离做法:直接输出解复用之后的的音频数据码流。
只需要在每次调用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)</

本文详细介绍了FFmpeg在处理H264码流时的封装格式处理,包括MPEG2TS与FLV、MP4等复用格式的区别。在分离H264视频码流时,需要添加SPS、PPS信息和起始码,而对于音频AAC码流,MP3可以直接存储,而FLV等格式则需添加ADTS头。此外,还提到了简单分离器与非简化版视音频分离器(demuxer)的工作原理。
&spm=1001.2101.3001.5002&articleId=103380201&d=1&t=3&u=e195886242c44ba089ef23211603d297)
966

被折叠的 条评论
为什么被折叠?



