2017-07-10 35 views
1

私は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(); 

答えて

1

あなたは(https://github.com/WritingMinds/ffmpeg-android-java)のようなffmpegのラッパーを使用して、コマンドラインffmpegのトリムアプローチを使用することができます。

ラッパーの利点は、ffmpegの統合の複雑さの多くを隠す必要があることです。また、コマンドライン構文を使用して、すべての一般的なffmpegの議論とサポートを活用できます。

あなたはその後、通常のffmpegのトリムの構文を使用することができます:120

上記の例を含む

モルテ情報:

関連する問題