私はFrameGrabberとFrameRecorderのffmpegの実装でビデオの長さを調整しようとしていますが、小さいサイズのファイルが破損してしまいます。多分、開始時間から終了時間までビデオをトリミングする他に、トリムの進行状況を更新する方法もあります。フレーム間の変化を記録していないようです。多分、mp4、flvなどのような異なるフォーマットのビデオをトリミングするいくつかの方法があります。ここでは、コードスニペットは次のとおりです。javacvとffmpegでAndroidのビデオ長を調整する
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();