首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java NAL到H264

Java NAL到H264
EN

Stack Overflow用户
提问于 2012-08-14 21:31:10
回答 2查看 3.5K关注 0票数 1

有没有人用过一个好的开源Java lib来支持NAL > H264转换?

我见过很多库,但大多数都不完整或很难使用(没有文档等)。

我想要的是传递NAL有效载荷,并获得实际的H.264原始视频。下一步是将其放入MP4容器中。

EN

回答 2

Stack Overflow用户

发布于 2012-08-15 00:46:08

根据评论中的讨论,我对您的问题进行了重新表述,并将其一分为二:

我想从纯java的H264 RTP包中提取NAL单元,并将它们转储到附件B的H264文件中。

我该怎么做?有图书馆吗?

这些数据包的有效负载在RFC3984中指定。

我不知道有哪个Java库可以开箱即用地执行这项任务。但只要打包类型不是交错的,实现就相当简单:

RFC3984支持三种封装类型

单NAL单元mode

  • Non-interleaved mode

  • Interleaved模式

只要您的数据包源以单NAL单元模式或非交错模式发送,您就可以从数据包中提取NAL单元而无需任何进一步处理,并使用0x00、0x00、0x00、0x01作为分隔符将它们转储到磁盘。

如果打包类型是交错的,您需要在其中投入更多的工作,因为您将不得不查看NAL并将它们重新排序,以使其按解码顺序排列。

我将原始的附件B H264文件多路复用到纯Java的MP4容器中

您可以使用我的mp4parser项目从附件B格式生成MP4。看一看H264Example --这应该会让你对如何使用它有所了解。

票数 2
EN

Stack Overflow用户

发布于 2013-05-22 14:21:43

下面是我在JCodec ( http://jcodec.org )示例中找到的内容:

代码语言:javascript
运行
复制
public class AVCMP4Mux {
    private static AvcCBox avcC;

    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Syntax: <in.264> <out.mp4>\n" + "\tWhere:\n"
                    + "\t-q\tLook for stream parameters only in the beginning of stream");
            return;
        }

        File in = new File(args[0]);
        File out = new File(args[1]);

        SeekableByteChannel file = writableFileChannel(out);
        MP4Muxer muxer = new MP4Muxer(file);
        CompressedTrack track = muxer.addTrackForCompressed(TrackType.VIDEO, 25);

        mux(track, in);

        muxer.writeHeader();

        file.close();
    }

    private static void mux(CompressedTrack track, File f) throws IOException {
        MappedH264ES es = new MappedH264ES(NIOUtils.map(f));

        ArrayList<ByteBuffer> spsList = new ArrayList<ByteBuffer>();
        ArrayList<ByteBuffer> ppsList = new ArrayList<ByteBuffer>();
        Packet frame = null;
        while ((frame = es.nextFrame()) != null) {
            ByteBuffer wrap = frame.getData().duplicate();
            H264Utils.encodeMOVPacket(wrap, spsList, ppsList);
            MP4Packet pkt = new MP4Packet(new Packet(frame, wrap), frame.getPts(), 0);
            System.out.println(pkt.getFrameNo());
            track.addFrame(pkt);
        }
        addSampleEntry(track, es.getSps(), es.getPps());
    }

    private static void addSampleEntry(CompressedTrack track, SeqParameterSet[] spss, PictureParameterSet[] ppss) {
        SeqParameterSet sps = spss[0];
        Size size = new Size((sps.pic_width_in_mbs_minus1 + 1) << 4, getPicHeightInMbs(sps) << 4);

        SampleEntry se = MP4Muxer.videoSampleEntry("avc1", size, "JCodec");

        avcC = new AvcCBox(sps.profile_idc, 0, sps.level_idc, write(spss), write(ppss));
        se.add(avcC);
        track.addSampleEntry(se);
    }

    private static List<ByteBuffer> write(PictureParameterSet[] ppss) {
        List<ByteBuffer> result = new ArrayList<ByteBuffer>();
        for (PictureParameterSet pps : ppss) {
            ByteBuffer buf = ByteBuffer.allocate(1024);
            pps.write(buf);
            buf.flip();
            result.add(buf);
        }
        return result;
    }

    private static List<ByteBuffer> write(SeqParameterSet[] spss) {
        List<ByteBuffer> result = new ArrayList<ByteBuffer>();
        for (SeqParameterSet sps : spss) {
            ByteBuffer buf = ByteBuffer.allocate(1024);
            sps.write(buf);
            buf.flip();
            result.add(buf);
        }
        return result;
    }
}

我从这里接过它:https://github.com/jcodec/jcodec/blob/master/samples/main/java/org/jcodec/samples/mux/AVCMP4Mux.java

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11953385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档