我想知道什么是起始码以及如何在H 264编解码器中找到i帧。基本上我正在尝试使用Java加密视频文件;如何解析视频文件以使用Java获取i帧?
答案 0 :(得分:3)
前面的答案是指nal_unit()中的nal_unit_type字段。 nal_unit的详细语法在ISO 14496-10的7.3.1()节中。
H.264和MPEG 2之间的一个不同之处在于H.264区分I切片和IDR。 I片本身可以被解码成完整的图片,但是之后解码的片段可以在I之前参考片段.3.32状态“在解码IDR图片之后,解码顺序中的所有后续编码图片可以在没有从IDR图片之前解码的任何图片进行的间隔预演“。它就像一个MPEG 2封闭的GOP。
返回nal_unit_type,请参阅表7-1,其中表明IDR具有nal_unit_type 5,但如果您正在查找I切片,则可以查看access_unit_delimiter()中的primary_pic_type(表7-5)( 7.3.2.4),或者您可以检查slice_header()的slice_type(表7-6)(第7.3.3节)
答案 1 :(得分:3)
根据上面的评论,这里有一个简单的代码片段:
ByteBuffer bb = ... // Byte buffer with your frame or h.264 NAL stream
int marker = 0xffffffff;
while (bb.hasRemaining()) {
int b = bb.get() & 0xff;
if (marker == 1) {
if ((b & 0x1f) == 5)
System.out.println("IDR slice!! " + (bb.position() - 1));
}
marker = (marker << 8) | b;
}
如果您只是想知道给定的帧是否是IDR切片(关键帧),您可以使用JCodec(http://jcodec.org)中的H264Utils.idrSlice:
ByteBuffer bb = ... // Byte buffer with your frame or h.264 NAL stream
if(H264Utils.idrSlice(bb))
System.out.println("IDR slice!!");
你想要使用库的原因是因为IDR NAL单位切片不是编码帧中唯一的切片,所以你必须通过SPS,PPS和SEI的序列才能最终到达你的IDR切片
答案 2 :(得分:1)
如果流是附件B格式,您可以查找“起始码前缀”,其等于0x000001,然后是NAL单元。 NALU类型信息在第一个字节中提供。