【发布时间】: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