1、分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。这些信息存储在AVCodecContext的extradata里面。并且需要使用FFMPEG中的名为"h264_mp4toannexb"的bitstream filter 进行处理,然后使用处理后的extradata。
AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
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);
fwrite(pkt.data,1,pkt.size,fp_video);
//...
}
av_free_packet(&pkt);
}
av_bitstream_filter_close(h264bsfc);
|
经过上述代码处理之后,AVPacket中的数据有如下变化:
*每个AVPacket的data添加了H.264的NALU的起始码{0,0,0,1}
*每个IDR帧数据前面添加了SPS和PPS
手工处理:
AVCodecContext *pCodecCtx=...
unsigned char *dummy=NULL;
int dummy_len;
AVBitStreamFilterContext* bsfc = av_bitstream_filter_init("h264_mp4toannexb");
av_bitstream_filter_filter(bsfc, pCodecCtx, NULL, &dummy, &dummy_len, NULL, 0, 0);
fwrite(pCodecCtx->extradata,pCodecCtx-->extradata_size,1,fp);
av_bitstream_filter_close(bsfc);
free(dummy);
|
1、分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。这些信息存储在AVCodecContext的extradata里面。并且需要使用FFMPEG中的名为"h264_mp4toannexb"的bitstream filter 进行处理,然后使用处理后的extradata。
AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
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);
fwrite(pkt.data,1,pkt.size,fp_video);
//...
}
av_free_packet(&pkt);
}
av_bitstream_filter_close(h264bsfc);
|
经过上述代码处理之后,AVPacket中的数据有如下变化:
*每个AVPacket的data添加了H.264的NALU的起始码{0,0,0,1}
*每个IDR帧数据前面添加了SPS和PPS
手工处理:
AVCodecContext *pCodecCtx=...
unsigned char *dummy=NULL;
int dummy_len;
AVBitStreamFilterContext* bsfc = av_bitstream_filter_init("h264_mp4toannexb");
av_bitstream_filter_filter(bsfc, pCodecCtx, NULL, &dummy, &dummy_len, NULL, 0, 0);
fwrite(pCodecCtx->extradata,pCodecCtx-->extradata_size,1,fp);
av_bitstream_filter_close(bsfc);
free(dummy);
|