抽取后h264数据
基础知识
Start code:(特征码)为了区分帧与帧形成的间隔,找出每一帧,方便播放器解析每一帧解码播放。
SPS/PPS:解码视频参数:帧率,宽、高……
SPS即Sequence Paramater Set,又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。
从ffmpeg中获取SPS/PPS
codec->etradata
编码器中扩展获取数据中得到
源码
#include<stdio.h>
#include<libavutil/log.h>
#include<libavformat/avformat.h>
#include<libavformat/avio.h>
#ifndef AV_WB32
# define AV_WB32(p,val)do { \
uint32_t d=(val); \
((uint8_t*)(p))[3]=(d); \
((uint8_t*)(p))[2]=(d)>>8; \
((uint8_t*)(p))[1]=(d)>>16; \
((uint8_t*)(p))[0]=(d)>>24; \
}while(0)
#endif
#ifndef AV_RB16
#define AV_RB16(x) \
(((const uint8_t*)(x)))[0]<<8 | \
(((const uint8_t*)(x))[1])
#endif
static int alloc_and_copy(AVPacket *out,
const uint8_t *sps_pps,uint32_t sps_pps_size,
const uint8_t *in,uint32_t in_size)
{
uint32_t offset = out->size;
uint8_t nal_header_size = offset ? 3:4;
int err;
err=av_grow_packet(out,sps_pps_size+in_size+nal_header_size);
if(err<0)
return err;
if(sps_pps)
memcpy(out->data + offset, sps_pps, sps_pps_size);
memcpy(out->data +sps_pps_size +nal_header_size + offset,in, in_size);
if(!offset){
AV_WB32(out->data +sps_pps_size,1);
}else{
(out->data + offset +sps_pps_size)[0]=
(out->data + offset +sps_pps_size)[1]=0;
(out->data + offset +sps_pps_size)[2]=1;
}
return 0;
}
int h264_extradata_to_annexb(const uint8_t *codec_extradata,const int codec_extradata_size,AVPacket *out_extradata,int padding)
{
uint16_t unit_size;
uint64_t total_size =0;
uint8_t *out =NULL,unit_nb,sps_done =0,
sps_seen =0,pps_seen=0,sps_offset=0,pps_offset=0;
const uin