如何将h264裸流ios h264封装mp4为mp4流

mp4v2 保存h264流 - phenom - ITeye技术网站
博客分类:
大侠已经完成了很多操作了,唯一不足的是,工程完整性差一些,而且对于一些关键点的说明,不太明确,至少对于我这样的人来说,看mp4v2的代码是有些吃力了.
引用文:http://blog.csdn.net/jwzhangjie/article/details/8857892
根据此文作者的相关几篇文章,已经成功实现了编译,打包视频了.
也遇到评论中的一些问题,视频除了vlc,其它都无法播放.
而且根据不同的sps,pps,出现的结果不太一样.具体为手机中(9500)中的文件浏览器中的缩略图显示与否.
本人用了作者的h264文件,发现其实它算是完整的mp4文件应该,把后缀修改下,可以在各播放器中正常播放.
通常,我们需要保存的是h264帧,raw数据,和aac流,比如视频监控的数据,目前这没有aac音频,无法测试,但有h264数据帧,所以进行了测试.
sps,pps的取值与作者有些不同.然后我又查了下资料,发现是000001开头的数据,然后是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就可以了.
下载次数: 103
下载次数: 149
浏览: 293670 次
来自: 福州
感谢楼主分享,帮大忙了。
你好,我最近也在搞这个,能发个demo吗,邮箱是:624951 ...
http://www. ...
好棒!感谢楼主分享DM365用UDP接收的方式做TS流或H264裸流解码可行吗? - 达芬奇(Davinci(TM)) - 德州仪器在线技术支持社区
DM365用UDP接收的方式做TS流或H264裸流解码可行吗?
发表于3年前
<input type="hidden" id="hGroupID" value="33"
&&&&&&&& 各位老师和朋友好,我想用DM365做TS流的网络硬解码。以前用DM365的Encode Demo程序改造成了一个TS流的发送端,用UDP传输,是参考移植了VLC的相关代码。后来在电脑上用VLC UDP接收能正常解码显示。现在想做一个与之配套的硬解码器,替代电脑上的VLC软解码软件。刚看了Decode的Demo程序,感觉很复杂很乱,比Encode的代码要繁杂很多。一时间无从下手。本来解码就是要比编码难做。&/p>
&p>&&&&&&& 我现在的想法是一步一步来,暂不考虑TS流的解码,也不考虑音频。先直接解DM365编的H264裸流,用UDP接收。因为Demo程序是用Loader模块来实现文件流的读取和管理。如果我想改造成UDP接收数据,该如何下手。感觉Demo程序读取文件很严格也很死板,MS只能从开头读,也不判断帧头,读取的一帧肯定是正常开始的一帧。而如果UDP网络接收,由于编码端后来有其它处理,不是一帧一帧的输出,而是有组合成一个固定长度输出,所以接收这边肯定不会是一个H264帧一帧的读取。所以感觉弄起来有点麻烦。特别是看了Decode的Demo程序,各种FIFO,各种Buffer之间的关系很乱。读文件还要先搞一个Loader_prime读第一帧。感觉读静态文件可行。弄成网络接收数据实时解码有点麻烦。&/p>
&p>&&&&&&& 还请各位老师,朋友,高手们指点一下思路。谢谢!&/p>&div style=&clear:&>&/div>" />
DM365用UDP接收的方式做TS流或H264裸流解码可行吗?
此问题已被解答
All Replies
&&&&&&&& 各位老师和朋友好,我想用DM365做TS流的网络硬解码。以前用DM365的Encode Demo程序改造成了一个TS流的发送端,用UDP传输,是参考移植了VLC的相关代码。后来在电脑上用VLC UDP接收能正常解码显示。现在想做一个与之配套的硬解码器,替代电脑上的VLC软解码软件。刚看了Decode的Demo程序,感觉很复杂很乱,比Encode的代码要繁杂很多。一时间无从下手。本来解码就是要比编码难做。
&&&&&&& 我现在的想法是一步一步来,暂不考虑TS流的解码,也不考虑音频。先直接解DM365编的H264裸流,用UDP接收。因为Demo程序是用Loader模块来实现文件流的读取和管理。如果我想改造成UDP接收数据,该如何下手。感觉Demo程序读取文件很严格也很死板,MS只能从开头读,也不判断帧头,读取的一帧肯定是正常开始的一帧。而如果UDP网络接收,由于编码端后来有其它处理,不是一帧一帧的输出,而是有组合成一个固定长度输出,所以接收这边肯定不会是一个H264帧一帧的读取。所以感觉弄起来有点麻烦。特别是看了Decode的Demo程序,各种FIFO,各种Buffer之间的关系很乱。读文件还要先搞一个Loader_prime读第一帧。感觉读静态文件可行。弄成网络接收数据实时解码有点麻烦。
&&&&&&& 还请各位老师,朋友,高手们指点一下思路。谢谢!
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
我觉得不管是读文件,还是udp流,其实都是解码器之前的操作,这个你可以自行设计
你只需要注意送往解码器,不是有个api的嘛,你把一帧数据送进去就可以了。
至于usp怎么parse出一帧,这个应该很容易找到一些开源代码的,如ffmpeg。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
谢谢你的回答。
我的思路是参考一下Loader模块的设计,改造它,或者干脆不用它。建立一个UDP接收的线程,将数据缓存,然后去解析其中的NAL帧,然后送入解码的FIFO。改觉思路应该就是这个思路,但实现起来可能会碰到各种各样的问题。。DEMO程序缓冲区管理和FIFO之间的管理感觉有点复杂。。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
进士4400分
送给decoder的第一帧必须要是I帧,否则decoder可能会乱掉
请参考codec engine API,Loader是DMAI的封装,你可以直接用codec engine来实现你要的功能
Stay hungry, stay foolish...
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
谢谢您的回复。
&送给decoder的第一帧必须要是I帧&,这个第一帧应该怎么理解?指的是程序运行以后解码器收到的第一帧吗?结合DEMO程序看的话,就是Loader_prime函数那块吧。
这个我试过,确实。如果我把encode出来的测试文件test.264直接decode的话,没有问题。但如果我用二进制编辑工具将这个文件的开头去掉几个字节的话再decode直接就出错退出了。
那假如说我能保证送给decoder的第一帧是一个I帧。此后送给decoder的帧如果不完全,或者开头几个字节丢掉,decoder会出错。换句话说,我直接读取N个字节,并不保证是一个帧的开始。如此这段数据扔给decoder会不会出问题?
You have posted to a forum that requires a moderator to approve posts before they are publicly available.使用FFMPEG从MP4封装中提取视频流到H264文件
使用FFMPEG从MP4封装中提取视频流到H264文件
ffmpeg -i 313.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 313.264
&-i 313.mp4 :是输入的MP4文件
-codec copy:从MP4封装中进行拷贝
-bsf: h264_mp4toannexb:从MP4拷贝到annexB封装
-f h264:采用h.264格式
313.264:输出的文件名称
发表评论:
TA的最新馆藏[转]&1854人阅读
ffmpeg(173)
http://doc.okbase.net/wenjingu/archive/101505.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2715702次
积分:34389
积分:34389
排名:第103名
原创:278篇
转载:2376篇
评论:214条
(5)(21)(39)(4)(27)(78)(31)(16)(27)(44)(7)(11)(39)(8)(58)(4)(13)(8)(16)(82)(74)(85)(9)(28)(5)(11)(13)(2)(2)(6)(9)(33)(8)(15)(3)(4)(1)(1)(8)(61)(10)(5)(1)(3)(40)(44)(21)(19)(11)(1)(1)(1)(1)(3)(14)(48)(48)(2)(14)(53)(12)(12)(17)(9)(25)(15)(17)(9)(18)(18)(2)(6)(1)(14)(8)(12)(23)(26)(14)(2)(13)(17)(53)(13)(2)(6)(5)(15)(10)(19)(14)(15)(5)(14)(28)(15)(17)(22)(3)(18)(9)(10)(13)(21)(22)(110)(78)(81)(21)(23)(42)(3)(5)(19)(16)(31)(1)(7)(14)(9)(12)(27)(30)(10)(19)(12)(6)(13)(17)(18)(23)(28)(19)(12)(5)(3)(5)(5)(5)(21)(11)(39)相关文章推荐:
h264码流格式标准
本文讲述的是对h264编码且封装成MP4格式的视频流进行RTP打包过程时需要了解的一些基本知识。
二、h264的基础知识
1.h264的编码格式
H.263 定义的码流结构是分级结构,共四层。自上而下分别为:图像层(picturelayer)、块组层(GOB
layer)、宏块层(macroblock layer)和块层(block layer)。而与H.263 相比,H.264的码流结构和H.263
的有很大的区别,它采用的不再是严格的分级结构。H.264 支持4:2:0 的连续或...
阅读(420) 回复(0)
其他文章推荐
/skyseraph/archive//2429384.html
阅读(480) 回复(0)
1.DTS, PTS
对于一个ES来说,他又许多I,P,B帧,而P, B帧都是以I,P帧作为参考。
由于B帧是前向后向参考,因此要对B帧作decode的话,
就必须先decode该B帧后面的P,或者I帧,
于是,decode的时间与帧的真正的present的时间就不一致了,
按照DTS一次对各个帧进行decode,
然后再按照PTS对各个帧进行展现
2.转自/logs/.html
Z=ROUND(Y/Qstep)其中Z为量化值,Y为输入系数值,...
Android平台
阅读(90) 回复(0)
这段时间,工作上的需要,在RTMP上做了flv流到标准h264、AAC的转换,服务器是开源项目CRTMPSERVER,客户端flex编写,视频编码h264,音频编码AAC,现将一些协议相关的东西记录如下。
一、分析FLV数据
我们先拿一个flv文件来简单分析一下flv数据的格式
flv标准文档下载地址/chef/archive//2597003.html
flv文件分析器flvprase下载地址/c...
阅读(0) 回复(0)
原文地址:/icecool0825/item/291c97823ae14a
1、宏块匹配像素精度: MPEG2中,运动估计的精度是1/2的像素,通过线性插值实现(可能有简单修正);
h264和MPEG4 都可以支持1/4像素的精度
2、参考帧的数量:MPEG2,MPEG4的P帧只能有一帧参考帧,B帧可以有两帧参考帧
阅读(0) 回复(0)
使用RTSP传输h264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter Set (PPS)
需要用到,那么这两项从哪里获取呢?答案是从h264码流中获取.在h264码流中,都是以&0x00 0x00 0x01&或者&0x00 0x00
0x00 0x01&为开始码的,找到开始码之后,使用开始码之后的第一个字节的低5位判断是否为7(sps)或者8(pps), 及data[4]
& 0x1f == 7 || data[4] & 0x1f ==
8.然后对获取的nal去掉开始码之后进行bas...
阅读(60) 回复(0)
一直比较困惑一个问题,都说ffmpeg功能很强大,但是自己一直没有去研究一下,今天终于见识了一下它的强大之处了!
首先当然是在linux下编译和安装成功ffmpeg,关于具体的安装流程,可以参考我前面的一篇博文!
这里就直接介绍怎么把.h264纯码流打包成.mp4 .avi等格式,我想这个问题也一定有很多网友在研究中,希望可以帮助到大家!
说白了,其实只要ffmpeg安装成功,打成各种格式一直是一条命令的事儿!关于ffmpeg更多的...
阅读(60) 回复(0)
H.264 视频 RTP 负载格式1. 网络抽象层单元类型 (NALU)NALU 头由一个字节组成, 它的语法如下:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
+---------------+F: 1 个比特.
forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.NRI: 2 个比特.
nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NALU 的重要性, 如 00 的 NALU 解码器...
阅读(0) 回复(0)
联合信源对AVS解码源码和相应的AVS码流。AVS码流太大,可以从/projects/avsdec下载。
解压avsdec_source.zip后,用VC6编译avsdecdll和test,bin目录下会生成dll文件和test.exe。
avsdec_source.zip
AVS标准我只有以下几份,不过对于视频编解码而言有P1、P2及P7就足够了。
AVS-P1-系统.pdf
AVS-P2-视频.pdf...
阅读(0) 回复(0)
H.264编码器输出的Bit流中,每个Bit都隶属于某个句法元素。句法元素被组织成有层次的结构,分别描述各个层次的信息。
在H.264 中,句法元素共被组织成
序列、图像、片、宏块、子宏块五个层次。在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确解码出来,尤其在序列层及图像层。
阅读(0) 回复(0)
rtmpdump可以下载rtmp流并保存成flv文件。
如果要对流中的音频或视频单独处理,需要根据flv协议分别提取。
简单修改rtmpdump代码,增加相应功能。
1 提取音频:
rtmpdump程序在Download函数中循环下载:
nRead = RTMP_Read(rtmp, buffer, bufferSize);
}while(!RTMP_ctrlC && nRead & -1 && RTMP_IsConnected(rtmp) && !RTMP_IsTimedout(rtmp));
原程序是收到后写文件,生成flv。
现在,在写之前分别...
阅读(510) 回复(0)
盛拓传媒:
北京皓辰网域网络信息技术有限公司. 版权所有
北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证:编号(京)字第1149号
ITPUB推荐文章解答你所有技术难题

我要回帖

更多关于 h264封装mp4 的文章

 

随机推荐