2017-12-11 16 views
1

ソースはhereから取得されています。記録されたビデオが歪んでいる(FFMPEG)

私はこれを初期化しています:

private void initRecorder() { 
    Log.i(LOG_TAG, "init mFrameRecorder"); 

    String recordedTime = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()) 
      .format(new Date()); 
    mVideo = CameraHelper.getOutputMediaFile(recordedTime, CameraHelper.MEDIA_TYPE_VIDEO); 
    Log.i(LOG_TAG, "Output Video: " + mVideo); 

    mFrameRecorder = new FFmpegFrameRecorder(mVideo, videoWidth, videoHeight, 1); 
    mFrameRecorder.setFormat("mp4"); 
    mFrameRecorder.setSampleRate(sampleAudioRateInHz); 
    mFrameRecorder.setFrameRate(frameRate); 
    // Use H264 
    mFrameRecorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); 
    mFrameRecorder.setVideoQuality(2); 

    mFrameRecorder.setVideoOption("crf", "20"); 
    mFrameRecorder.setVideoOption("preset", "superfast"); 
    mFrameRecorder.setVideoOption("tune", "zerolatency"); 

    Log.i(LOG_TAG, "mFrameRecorder initialize success"); 
} 

どこframeRate = 60

とビデオ録画:

class VideoRecordThread extends RunningThread { 
    @Override 
    public void run() { 
     List<String> filters = new ArrayList<>(); 
     // Transpose 
     String transpose = null; 
     android.hardware.Camera.CameraInfo info = 
       new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(mCameraId, info); 
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      switch (info.orientation) { 
       case 270: 
        transpose = "transpose=cclock"; // Mirrored horizontally as preview display 
        break; 
       case 90: 
        transpose = "transpose=clock"; // Mirrored horizontally as preview display 
        break; 
      } 
     } else { 
      switch (info.orientation) { 
       case 270: 
        transpose = "transpose=cclock"; 
        break; 
       case 90: 
        transpose = "transpose=clock"; 
        break; 
      } 
     } 
     if (transpose != null) { 
      filters.add(transpose); 
     } 
     // Crop (only vertically) 
     int width = previewHeight; 
     int height = width * videoHeight/videoWidth; 
     String crop = String.format(Locale.getDefault(),"crop=%d:%d:%d:%d", 
       width, height, 
       (previewHeight - width)/2, (previewWidth - height)/2); 
     filters.add(crop); 
     // Scale (to designated size) 
     String scale = String.format(Locale.getDefault(),"scale=%d:%d", videoHeight, videoWidth); 
     filters.add(scale); 

     FFmpegFrameFilter frameFilter = new FFmpegFrameFilter(TextUtils.join(",", filters), 
       previewWidth, previewHeight); 
     frameFilter.setPixelFormat(avutil.AV_PIX_FMT_NV21); 
     frameFilter.setFrameRate(frameRate); 
     try { 
      frameFilter.start(); 
     } catch (FrameFilter.Exception e) { 
      e.printStackTrace(); 
     } 

     isRunning = true; 
     FrameToRecord recordedFrame; 

     while (isRunning || !mFrameToRecordQueue.isEmpty()) { 
      try { 
       recordedFrame = mFrameToRecordQueue.take(); 
      } catch (InterruptedException ie) { 
       ie.printStackTrace(); 
       try { 
        frameFilter.stop(); 
       } catch (FrameFilter.Exception e) { 
        e.printStackTrace(); 
       } 
       break; 
      } 

      if (mFrameRecorder != null) { 
       long timestamp = recordedFrame.getTimestamp(); 
       if (timestamp > mFrameRecorder.getTimestamp()) { 
        mFrameRecorder.setTimestamp(timestamp); 
       } 
       long startTime = System.currentTimeMillis(); 
       Frame filteredFrame = null; 
       try { 
        frameFilter.push(recordedFrame.getFrame()); 
        filteredFrame = frameFilter.pull(); 
       } catch (FrameFilter.Exception e) { 
        e.printStackTrace(); 
       } 
       try { 
        mFrameRecorder.record(filteredFrame); 
       } catch (FFmpegFrameRecorder.Exception e) { 
        e.printStackTrace(); 
       } 
       long endTime = System.currentTimeMillis(); 
       long processTime = endTime - startTime; 
       mTotalProcessFrameTime += processTime; 
       Log.d(LOG_TAG, "This frame process time: " + processTime + "ms"); 
       long totalAvg = mTotalProcessFrameTime/++mFrameRecordedCount; 
       Log.d(LOG_TAG, "Avg frame process time: " + totalAvg + "ms"); 


      } 
      Log.d(LOG_TAG, mFrameRecordedCount + "/" + mFrameToRecordCount); 
      mRecycledFrameQueue.offer(recordedFrame); 
     } 
    } 

    public void stopRunning() { 
     super.stopRunning(); 
     if (getState() == WAITING) { 
      interrupt(); 
     } 
    } 
} 

事実は、ビデオを録画するとき何のラグ(フリーズ)が目立たなくされていないことです。ビデオを録画した後、注意深く見ると遅れが目立ちます。録画中に素早く電話を移動すると、録画後にいくつかのGIFを接着したようにフリーズを見ることができます。

私は私ができるすべてのものを試してみました:フレームレートは、私はビデオの品質、ピクセルフォーマット(私は理由を知りませんが)、私は理解していなかった

ことを多くのことを変更30、60、100に変更。しかし、まだ使用していません。多分、理解している人がいるでしょう。これらの歪み(凍結)を修正する方法を教えてください。

UPD: LogCat:

> 12-13 08:51:21.987 2968-2968/io.dev.videosample 
> D/FFmpegRecordActivity: Preview frame interval: 98ms 
> 12-13 08:51:22.056 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 69ms 
> 12-13 08:51:22.137 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 81ms 
>12-13 08:51:22.205 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 68ms 
>12-13 08:51:22.254 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 49ms 
>12-13 08:51:22.305 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 51ms 
>12-13 08:51:22.336 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 31ms 
>12-13 08:51:22.454 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 118ms 
>12-13 08:51:22.494 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 40ms 
>12-13 08:51:22.585 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 91ms 
>12-13 08:51:22.634 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 49ms 
>12-13 08:51:22.720 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 86ms 
>12-13 08:51:22.783 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 63ms 
>12-13 08:51:22.835 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 52ms 
>12-13 08:51:22.903 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 67ms 
>12-13 08:51:22.983 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 81ms 
>12-13 08:51:23.070 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 87ms 
>12-13 08:51:23.149 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 78ms 
>12-13 08:51:23.234 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 86ms 
>12-13 08:51:23.312 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 78ms 
>12-13 08:51:23.395 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 83ms 
>12-13 08:51:23.472 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 77ms 
>12-13 08:51:23.540 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 67ms 
>12-13 08:51:23.627 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 88ms 
>12-13 08:51:23.660 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 33ms 
>12-13 08:51:23.727 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 67ms 
>12-13 08:51:23.792 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 65ms 
>12-13 08:51:23.874 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 82ms 
>12-13 08:51:23.942 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 68ms 
>12-13 08:51:23.995 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 53ms 
>12-13 08:51:24.090 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 95ms 
>12-13 08:51:24.139 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 49ms 
>12-13 08:51:24.224 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 85ms 
>12-13 08:51:24.272 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 48ms 
>12-13 08:51:24.307 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 35ms 
>12-13 08:51:24.371 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 64ms 
>12-13 08:51:24.437 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 66ms 
>12-13 08:51:24.521 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 84ms 
>12-13 08:51:24.587 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 66ms 
>12-13 08:51:24.636 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 49ms 
>12-13 08:51:24.719 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 83ms 
>12-13 08:51:24.808 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 89ms 
>12-13 08:51:24.869 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 61ms 
>12-13 08:51:24.905 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 36ms 
>12-13 08:51:24.952 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 46ms 
>12-13 08:51:25.017 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 66ms 
>12-13 08:51:25.068 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 51ms 
>12-13 08:51:25.102 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 34ms 
>12-13 08:51:25.204 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 102ms 
>12-13 08:51:25.299 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 95ms 
>12-13 08:51:25.413 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 114ms 
>12-13 08:51:25.481 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 68ms 
>12-13 08:51:25.563 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 82ms 
>12-13 08:51:25.630 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 67ms 
>12-13 08:51:25.712 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 82ms 
>12-13 08:51:25.761 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 49ms 
>12-13 08:51:25.844 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 83ms 
>12-13 08:51:25.862 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 18ms 
>12-13 08:51:25.910 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 48ms 
>12-13 08:51:25.946 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 36ms 
>12-13 08:51:26.033 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 87ms 
>12-13 08:51:26.126 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 93ms 
>12-13 08:51:26.192 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 66ms 
>12-13 08:51:26.225 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 33ms 
>12-13 08:51:26.275 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 50ms 
>12-13 08:51:26.357 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 82ms 
>12-13 08:51:26.440 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 83ms 
>12-13 08:51:26.522 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 82ms 
>12-13 08:51:26.589 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 67ms 
>12-13 08:51:26.640 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 50ms 
>12-13 08:51:26.721 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 82ms 
>12-13 08:51:26.826 2968-2968/io.dev.videosample D/FFmpegRecordActivity: Preview frame interval: 105ms 
>12-13 08:51:28.408 1976-4266/? E/VDO_LOG: u4FrameTsInterval value is 0x411a, u4FrameTimingInfo 0xf000 
>12-13 08:51:28.421 1976-4266/? E/MtkOmxVdecEx: [0xb872bb60] ERROR: query VDEC_DRV_GET_TYPE_GET_FRAME_INTERVAL failed 
+0

をチェックする必要がlogcatをチェックして、**プレビューフレーム間隔**をフィルタリングします。あなたのデバイスの範囲はどれくらいですか? – CrazyOrr

+0

@CrazyOrr質問を更新しました。 –

+0

録画された動画のタイムスタンプはこれらの値に基づいていますが、遅れは特に高いものから来ています。 'crf'値を調整し、この値がより安定しているかどうか確認してください。 – CrazyOrr

答えて

関連する問題