简体   繁体   中英

The recorded video is distorted (FFMPEG)

The source is taken from here .

I'm initializing this:

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");
}

where frameRate = 60 ;

And video recording:

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();
        }
    }
}

The fact is that when recording video no lags(freezes) are not noticeable. After recording the video, when you look carefully, the lags are noticeable, and if you move the phone quickly when recording, then after the recording you can see the freezes, as if you have glued several GIFs.

I tried everything I could: the frame rate changed for 30, 60, 100. I changed the Video quality, pixelFormat (although I do not know why) and many things that

I did not understand. But still no use. Maybe there is someone who understands. Tell me how to correct these distortions(freezes)?

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM