本文介绍: imx的例程是设置一个大的缓冲区,一次性读入不超过10M字节数据,然后全部送到解码器进行解码,对于小于10M字节的视频数据确实很方便的解码了,但是文件大了这种方式就不行了。首先分析下H264裸流文件,发现每一帧数据的起始码是00 00 00 01,那么就可以利用这个起始码来拆分每一帧数据。代码很简单,就是持续读取文件,碰到00 00 00 01则表示一帧读完,然后把这一帧数据送到解码器处理即可。还有一种处理方式是使用FFMpeg来读取每一帧数据,然后送入解码器,是可行的。
imx的例程是设置一个大的缓冲区,一次性读入不超过10M字节数据,然后全部送到解码器进行解码,对于小于10M字节的视频数据确实很方便的解码了,但是文件大了这种方式就不行了。
如果暴力分段送入解码器,因为无法找到H264的起始码,解码器会报错。
还有一种处理方式是使用FFMpeg来读取每一帧数据,然后送入解码器,是可行的。参考这篇博文。
首先分析下H264裸流文件,发现每一帧数据的起始码是00 00 00 01,那么就可以利用这个起始码来拆分每一帧数据。
代码很简单,就是持续读取文件,碰到00 00 00 01则表示一帧读完,然后把这一帧数据送到解码器处理即可。
//读取一帧H264数据
int read_one_frame(FILE *fp, unsigned char *ptr){
int size=0;
static unsigned char ts[4]={0};
printf("read one framen");
//防止文件数据错误
if(fread(ptr,1,4,fp)<4){
printf("read start errorn");
return size;
}
if((*ptr==0x00) && (*(ptr+1)==0x00) && (*(ptr+2)==0x00) && (*(ptr+3)==0x01)){
size=4;
while(1){
if(fread(ptr+size,1,1,fp)){
ts[0]=ts[1];
ts[1]=ts[2];
ts[2]=ts[3];
ts[3]=*(ptr+size);
size++;
if((ts[0]==0x00) && (ts[1]==0x00) && (ts[2]==0x00) && (ts[3]==0x01) ){
//读取到下一帧的起始码,即表示这帧读完了,后移文件指针
size-=4;
fseek(fp,-4,SEEK_CUR);
//printf("read one frame end n");
break;
}
}else
break;//读完文件退出循环
}
}
//读取到的数据大小
return size;
}
#include <stdio.h>
#include <stdlib.h>
int main(void){
int readbytes;
int totalReadSize=0;
int length=1024*1024*10;
unsigned char *ptr;
ptr=malloc(length);
FILE *fp=fopen("200frames_count.h264", "rb");
int fileSize;
fseek(fp, 0L, SEEK_END);
fileSize = ftell(fp);
fseek(fp, 0L, SEEK_SET);
printf("fileSize=0x%xn", fileSize);
while(totalReadSize<fileSize){
readbytes=read_one_frame(fp, ptr);
if(readbytes==0){
printf("read endn");
break;
}else{
for(int i=0;i<readbytes;i++)
printf("%x ", *(ptr+i));
}
totalReadSize+=readbytes;
printf("readbytes: 0x%X total read size: 0x%X rn",readbytes, totalReadSize);
}
return 0;
}
从打印数据看,成功实现了每一帧数据的读取,经过测试可用,老铁们可以自己拿去优化使用。
对于H264裸流文件可以这么处理,如果是带格式的,老铁们还是用FFMpeg吧。
原文地址:https://blog.csdn.net/huntenganwei/article/details/134715250
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_39960.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。