从MP4容器中解析出H264码流

使用开源库ffmpeg

先定义两个全局变量

/*global variable, for demuxing -------*/
AVPacket packet;
AVFormatContext * pFormatCtx = NULL; 


需要提前注册

/*add by zorro, for demuxing mp4------------*/

av_register_all(); 
if (av_open_input_file(&pFormatCtx, cmd->input, NULL, 0, NULL) < 0){
printf("Open Input Error!\n");
return -1;

av_init_packet(&packet);
/*init the H264head */

H264head = H264buf;


之后就可以通过下面的函数从MP4文件中读取H264码流了,里面用递归实现,函数不可重入

/*==============h264buff_read================
*Function: read h264 data from H264buf, and demuxing raw data 
  from mp4 file
*Author: zorro
*Date :6/3/2015
*======================================*/
int
h264_read(char *buf, int n)
{
static char H264buf[H264BUFSIZE];
static char *H264head = H264buf;
static int H264len = 0;

int rdn = 0, rdnn;
int sps_len;


//printf("zorro,vpu_read: read len = %d, h264len = %d\n", n, H264len); /*n = 262144*/
if (H264len >= n){
memcpy(buf, H264head, n);
H264head+=n;
H264len -= n;
rdn = n;
}
else{
memcpy(buf, H264head, H264len);
H264head = H264buf;
n -=H264len;
rdn = H264len;
H264len = 0;
if (av_read_frame(pFormatCtx, &packet) < 0){
av_free_packet(&packet);
printf("h264buff_read: av_read_frame error, rdn = %d\n", rdn);
return rdn;
}
unsigned char *data = packet.data; 
int size = packet.size; 

//printf("zorro,vpu_read: packet size = %d\n", size);  size pframe 4000,iframe 18000
/*check sps head-----*/
if ((data[4] & 0x1f) == 0x07){
sps_len = data[3];
/*pps head-----*/
data[sps_len+4] = 0;
data[sps_len+5] = 0;
data[sps_len+6] = 0;
data[sps_len+7] = 0x01;
}
data[0] = 0;
data[1] = 0;
data[2] = 0;
data[3] = 0x01;

if (size > H264BUFSIZE){
av_free_packet(&packet);
printf("h264buff_read: H264buf full\n");
return -1;
}
memcpy(H264buf, data, size);
H264len = size;
av_free_packet(&packet);

rdnn = vpu_read(cmd, &buf[rdn], n);
if (rdnn  < 0){
return -1;
}
else{
rdn += rdnn;
}

}
return rdn;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值