【问题标题】:Trim video length in Android with javacv and ffmpeg使用 javacv 和 ffmpeg 在 Android 中修剪视频长度
【发布时间】:2017-07-11 15:57:48
【问题描述】:

我正在尝试使用 FrameGrabber 和 FrameRecorder 的 ffmpeg 实现来修剪视频长度,但是会得到更小尺寸的损坏文件。也许还有其他方法可以从开始时间到结束时间修剪视频,也可以更新修剪进度。似乎它没有记录帧之间的变化。也许还有其他一些方法可以修剪不同格式的视频,如 mp4、flv 等。这是代码sn-p:

        FrameGrabber grabber = new FFmpegFrameGrabber(mClip.getPath());
        grabber.start();
        grabber.setTimestamp(mClip.getClipStartMs()); // Write from specific moment

        File out = new File(mClip.getOutPutPath(params[0])); // Set destination to write
        FrameRecorder recorder = new FFmpegFrameRecorder(out, grabber.getImageWidth(), grabber.getImageHeight());


        recorder.setFormat(grabber.getFormat());
        recorder.setFrameRate(grabber.getFrameRate());
        recorder.setSampleRate(grabber.getSampleRate());
        recorder.setAspectRatio(grabber.getAspectRatio());
        recorder.setSampleFormat(grabber.getSampleFormat());

        recorder.setAudioCodec(grabber.getAudioCodec());
        recorder.setAudioBitrate(grabber.getAudioBitrate());
        recorder.setAudioChannels(grabber.getAudioChannels());

        recorder.setVideoCodec(grabber.getVideoCodec());
        recorder.setVideoBitrate(grabber.getVideoBitrate());

        recorder.start();

        Frame frame;
        Long timestamp;
        Long fullLength = mClip.getClipEndMs() - mClip.getClipStartMs();
        double percent = 0d, oldPercent = 0d;

        while ((frame = grabber.grabFrame()) != null && (timestamp = grabber.getTimestamp()) <= mClip.getClipEndMs()) {
            Log.d(ASYNC_SAVE_TAG, "Started command : ffmpeg " + mClip.toString());

            if (timestamp != 0d) {
                oldPercent = percent;
                percent = timestamp.doubleValue() / fullLength.doubleValue();
                if (MathUtil.compare(percent, oldPercent) != 0) {
                    publishProgress(percent);
                }
            }

            recorder.setTimestamp(grabber.getTimestamp() - mClip.getClipStartMs());
            recorder.record(frame);
        }

        grabber.close();
        recorder.close();

【问题讨论】:

    标签: android video ffmpeg javacv


    【解决方案1】:

    您可以使用像 (https://github.com/WritingMinds/ffmpeg-android-java) 这样的 ffmpeg 包装器,然后使用命令行 ffmpeg trim 方法。

    包装器的优点是它应该隐藏集成 ffmpeg 的大部分复杂性,并且它允许您使用命令行语法并利用所有一般 ffmpeg 讨论和对此的支持。

    然后您可以使用常规的 ffmpeg 修剪语法:

    ffmpeg -i INPUT -vf trim=60:120

    Morte 信息包括上面的例子:

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 2012-08-03
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2015-10-11
      • 2018-02-07
      • 1970-01-01
      • 2015-10-27
      相关资源
      最近更新 更多