【问题标题】:JavaCV read video and recordJavaCV读取视频并录制
【发布时间】:2014-12-04 10:35:50
【问题描述】:

我正在尝试在Android上合并mp4和mp3,我使用的是JavaCV,请先检查我下面的代码,然后我解释了这个奇怪的错误:

private void test2() throws Exception {
    String path = Environment.getExternalStorageDirectory()
            .getAbsolutePath();

    int testId = 4;
    String videoPath = path + "/" + "sample" + testId + ".mp4";
    String audioPath = path + "/" + "love.mp3";
    String outputPath = path + "/" + "out" + testId + ".mp4";

    FrameGrabber grabber1 = new FFmpegFrameGrabber(videoPath);
    FrameGrabber grabber2 = new FFmpegFrameGrabber(audioPath);

    grabber1.start();
    grabber2.start();

    FrameRecorder recorder = new FFmpegFrameRecorder(outputPath,
            grabber1.getImageWidth(), grabber1.getImageHeight(),
            grabber2.getAudioChannels());

    double frameRate = grabber1.getFrameRate();
    recorder.setFrameRate(frameRate);
    recorder.setSampleRate(grabber2.getSampleRate());
    recorder.setVideoQuality(1);

    recorder.start();

    Frame frame1, frame2 = null;

    // getLengthInTime is correct, but getLengthInFrames not accurate.
    Log.d(TAG, " Video lengthInTime:" + grabber1.getLengthInTime()
            + " Video frames:" + grabber1.getLengthInFrames());

    // Record video.
    int count = 0;
    while (true) {
        frame1 = grabber1.grabFrame();
        if (frame1 == null) {
            break;
        }

        frame1.samples = null;
        recorder.record(frame1);
        count++;

        Log.d(TAG, "Video frame timestamp:" + grabber1.getTimestamp());
    }
    Log.d(TAG, " Video frame count:" + count);

    // Record audtio.
    long videoTimestamp = recorder.getTimestamp();
    while (true) {
        frame2 = grabber2.grabFrame();
        if (frame2 != null && grabber2.getTimestamp() <= videoTimestamp) {
            frame2.image = null;
            recorder.record(frame2);

            // Log.d(TAG, "Audio frame timestamp:" +
            // grabber2.getTimestamp());
        } else {
            break;
        }
    }

    // release
    recorder.stop();
    recorder.release();

    grabber1.stop();
    grabber2.stop();
}

输出的音频正常,但视频被扼杀。视频播放 1s 并停止 1s,然后像这样重复。我用Phone的摄像头录制的输入视频。

我尝试计算视频帧的实际数量,发现实际数量比从方法 getLengthInFrames() 得到的数字大得多。

【问题讨论】:

    标签: android ffmpeg javacv


    【解决方案1】:

    frameGrabber 同时抓取 ImageFrames 和 Sound Frames

    如果您需要处理 VideoFrames 或其计数,请这样做

    Frame grabFrame = frameGrabber.grabFrame();
    if (grabFrame == null) {
                            // all frames are processed
                            System.out.println("!!! Failed cvQueryFrame");
                            runOnUiThread(new Runnable() {
    
                                @Override
                                public void run() {
                                    Toast.makeText(RecordActivity.this, "Done !!!", Toast.LENGTH_SHORT).show();
                                }
    
                            });
                            break;
                        }
                        if (grabFrame.image != null) {
                               //This is a video Frame, Do your work here 
     }
    
    }
    

    【讨论】:

    • 嗨@Sarkar 感谢您的回答,它现在正在工作,另一个问题,我想通过 javacv 播放 mp4,例如在屏幕上绘制图像帧(Android),有什么想法吗?
    • 这是一个猜测。首先创建 CanvasFrame,然后使用“canvas.showImage(captured_frame);”而不是“recorder.record(captured_frame);”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2016-08-11
    相关资源
    最近更新 更多