如何使用java

时间:2017-08-17 09:05:08

标签: java video ffmpeg

我想使用java库剪切和合并一些avi视频(相同的编解码器,相同的分辨率,相同的fps)。

现在我正在尝试使用基于ffmpeg的Humble视频(https://github.com/artclarke/humble-video)。

我想先使用搜索功能剪切输入视频,但结果不正确。

这是我的代码。

public void cutjob(String input, String output, int starttime) {
        final Demuxer demuxer = Demuxer.make();
        final Muxer muxer = Muxer.make(output, null, "avi");
        try {
            demuxer.open(input, null, false, true, null, null);
            final MuxerFormat format = MuxerFormat.guessFormat("avi", null, null);
            int n = demuxer.getNumStreams();
            final Decoder[] decoders = new Decoder[n];
            for (int i = 0; i < n; i++) {
                final DemuxerStream ds = demuxer.getStream(i);
                decoders[i] = ds.getDecoder();
                final Decoder d = decoders[i];
                if (d != null) {
                    if (format.getFlag(MuxerFormat.Flag.GLOBAL_HEADER))
                        d.setFlag(Coder.Flag.FLAG_GLOBAL_HEADER, true);
                    d.open(null, null);
                    muxer.addNewStream(d);
                }
            }
            muxer.open(null, null);

            demuxer.seek(-1, Long.MIN_VALUE, (long)starttime* Global.getDefaultTimeBase().getDenominator(), Long.MAX_VALUE, Demuxer.SeekFlag.SEEK_ANY.swigValue());
            final MediaPacket packet = MediaPacket.make();
            long dts = -1;
            while (demuxer.read(packet) >= 0) {
                System.out.println("dts:"+packet.getDts() + ",pts:"+packet.getPts());
                final Decoder d = decoders[packet.getStreamIndex()];
                if (packet.isComplete() && d != null) {
                    dts = dts == -1 ? packet.getDts() : dts;

                    packet.setDts(packet.getDts() - dts);
                    packet.setPosition(-1);
                    muxer.write(packet, false);

                }
            }
            muxer.close();
            demuxer.close();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

视频源长约190秒,我将“starttime”设置为180, 想要减少最后10秒并写入新的avi文件。

输出avi文件长10秒,但只有视频的最后5s是正确的,前5s似乎没有数据。

我的代码有什么问题。 谢谢。

0 个答案:

没有答案