ffmpeg——抽取h264数据

抽取后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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值