当前位置: 代码迷 >> 多媒体/流媒体开发 >> 怎么把H264文件的数据一帧一帧的读出来?(先不用考虑解码)
  详细解决方案

怎么把H264文件的数据一帧一帧的读出来?(先不用考虑解码)

热度:7934   发布时间:2013-02-26 00:00:00.0
如何把H264文件的数据一帧一帧的读出来?(先不用考虑解码)

如何把H264文件的数据一帧一帧的读出来?(先不用考虑解码)

谢谢!

------解决方案--------------------------------------------------------
不考虑解码,怎么可能一帧一帧的读出来?
------解决方案--------------------------------------------------------
你的h264的文件格式是标准的? 比如 mp4,h264,avi,等等。
如果是这些标准的格式存储,可以用ffmpeg里面的avformat这个库读取。

------解决方案--------------------------------------------------------
根据帧头信息可以读一个个的nal,可能是00 00 01也可能是由四个字节指定的大小。

必须要解析,可能读取的nal是pps,sps,或只是一帧的一个slice
------解决方案--------------------------------------------------------
当然是可以的。这其实是一个协议分析过程,每一帧H264数据都是可以通过观察二进制码流分析出来的。根据协议说明,每一帧图像一般在开头有一个单元分隔符NAL,两个单元分隔符之间的数据包就是一帧图像。就是00 00 01 09,这个09就是单元分隔符的标志。不过协议并没有说NAL流必须如此组织,可能还有其它的组织形式。我手头的H264文件都是这样组织的。
------解决方案--------------------------------------------------------
看你如何采集的,我这边有一个21字节的文件头00 00 00 01 67 42 00 1E AB 40 B0 4B 20 00 00 00 01 68 CE 38 80,然后以00 00 00 01为一帧的开始。有时会在每一帧开始时加入每一帧的大小4字节。
------解决方案--------------------------------------------------------
引用:
看你如何采集的,我这边有一个21字节的文件头00 00 00 01 67 42 00 1E AB 40 B0 4B 20 00 00 00 01 68 CE 38 80,然后以00 00 00 01为一帧的开始。有时会在每一帧开始时加入每一帧的大小4字节。


你这是一个序列参数集,不是建议NAL序列中的第一个NAL,在单元分隔符NAL之后。不过它可以算是新的一帧的开始,如果没有单元分隔符NAL的话,用这个区分一帧数据是可以的,只是不太方便。
------解决方案--------------------------------------------------------
先要看文件格式吧  mp4  和avi解析的方式就不一样
------解决方案--------------------------------------------------------
引用:
to ttxk: 

视频怎么会没有帧的概念呢?


H264的字节流确实没有帧的概念.具体原因请仔细研读协议.
这里我并没有说视频.
------解决方案--------------------------------------------------------
这个要看你怎么理解了。和MPEG2、MPEG4相比,H.264字节流中帧的形式发生了变化。以视频帧为例,MPEG2和MPEG4字节流在传输的时候提取帧的关键参数,将其封装入传输包首部,比如TS包或RTP包,而包负载中的数据仍然是一个完整的图像帧。也就是说,你即使不使用包首部中所设置的关于包负载的参数信息,也能够根据包负载中的帧数据本身进行正确的解码。

而H.264码流本身对图像数据就做了处理,将一个完整的图像帧进行分解,抽出序列参数集、图像参数集等帧信息,放到各自对应的NAL中,而图像数据本身则封装进编码条带中。这样,在NAL流中,仅仅根据编码条带NAL单元是解析不出图像来的,必须和序列参数集、图像参数集NAL配合才能解出。也就是说,MPEG2、MPEG4编码的一帧数据,被分解成了H.264中的多个NAL单元,H.264编码的抽象化程度更高了。但是H.264码流在组织的时候仍然是以一帧数据为单位的,它并不会将多帧数据交织到一起,只不过表现在形式上,需要用多个NAL单元才能组成一个完整的数据帧。
------解决方案--------------------------------------------------------
引用:
引用:
 看你如何采集的,我这边有一个21字节的文件头00 00 00 01 67 42 00 1E AB 40 B0 4B 20 00 00 00 01 68 CE 38 80,然后以00 00 00 01为一帧的开始。有时会在每一帧开始时加入每一帧的大小4字节。


 你这是一个序列参数集,不是建议NAL序列中的第一个NAL,在单元分隔符NAL之后。不过它可以算是新的一帧的开始,如果没有单元分隔符NAL的话,用这个区分一帧数据是可以的,只是不太方便。

像我这种情况怎么区分一帧数据比较好?
该怎么组织数据?
------解决方案--------------------------------------------------------
你下载这个h.264解码器的工程源码   跟踪一边就清楚了。 http://www.winbile.net/bbs/forums/threads/1012589.aspx