mp4v2 保存h264流

大侠已经完成了很多操作了,唯一不足的是,工程完整性差一些,而且对于一些关键点的说明,不太明确,至少对于我这样的人来说,看mp4v2的代码是有些吃力了.
引用文:http://blog.csdn.net/jwzhangjie/article/details/8857892
根据此文作者的相关几篇文章,已经成功实现了编译,打包视频了.

也遇到评论中的一些问题,视频除了vlc,其它都无法播放.
而且根据不同的sps,pps,出现的结果不太一样.具体为手机中(9500)中的文件浏览器中的缩略图显示与否.

本人用了作者的h264文件,发现其实它算是完整的mp4文件应该,把后缀修改下,可以在各播放器中正常播放.

通常,我们需要保存的是h264帧,raw数据,和aac流,比如视频监控的数据,目前这没有aac音频,无法测试,但有h264数据帧,所以进行了测试.

sps,pps的取值与作者有些不同.然后我又查了下资料,发现是000001或00000001开头的数据,然后是sps,然后又是这段,pps,然后又这段,再是其它(mp4文件其它元素)等.然后把I帧打开一看
00 00 00 01 67 42 E0 14 DA 05 82 51 00 00 00 01
68 CE 30 A4 80 00 00 00 01 06 E5 01 A2 80 00 00
00 01
这是头部分
67就是sps的开头,68是pps,通常在一个流中,这些都是固定的,所以取一帧即可,而且要I帧.而且是00 00 00 01开头,标识的,没有作者程序中的aavc这样的数据,这个似乎是一个mp4文件中才存在的.而raw流应该是00 00 00 01开头的.
明白这个后,sps,pps就容易取出来的,因为只有这样的标识,没有长度标识,所以相对固定一些,可以解析,也可以直接用16进制查看得到.然后就有了.
unsigned char sps_pps_640[17] = {0x67, 0x42, 0xE0, 0x14, 0xDA, 0x05, 0x82, 0x51, 0x68, 0xCE, 0x30, 0xA4, 0x80};
sps,8个单位67 42 E0 14 DA 05 82 51
pps是5个68 CE 30 A4 80,作者是将二者合并的,其实不必
MP4AddH264SequenceParameterSet(fileHandle, video, sps_pps, sps_index);
MP4AddH264PictureParameterSet(fileHandle, video, sps_pps + sps_index, pps_index);

可惜啊,这样得到的视频,一般播放器无法播放,手机里的vlc可以,但pc上却不行.文件浏览器可以看到缩略图了,系统播放器依旧无法播放.

sps,pps无法正确地得到,但不明白哪个步骤出了错误,只有再研究了,还有作者的那块h264文件 个人觉得不适合用,视频监控的I帧也上传一个,可以测试下.

工程sps替换上面的就可以了.然后长度修改下.包含jni部分,也可以自己编译,在jni目录中运行ndk-build就可以了.

你可能感兴趣的:(android)