录制的视频失真(FFMPEG)

时间:2017-12-11 14:17:37

标签: java android ffmpeg

来源取自here

我正在初始化这个:

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。我改变了视频质量,pixelFormat(虽然我不知道为什么)和很多东西

我不明白。但仍然没有用。也许有人理解。告诉我如何纠正这些扭曲(冻结)?

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

1 个答案:

答案 0 :(得分:0)

请通过http://androidwarzone.blogspot.in/2011/12/ffmpeg4android.html 你需要根据你的需要检查fps,视频分辨率。你必须检查ffmpeg命令的多个试验值