使用FFmpeg的Android相机拍摄(Android Camera Capture using

2019-07-21 03:55发布

是试着采取由机器人摄像机生成的预览帧,并通过所述data[]到FFMPEG输入管以产生一FLV视频。 我使用的命令是:

ffmpeg -f image2pipe -i pipe: -f flv -vcodec libx264 out.flv

我还试图迫使输入格式yuv4mpegpiperawvideo但没有成功...通过Android系统的相机产生的预览框的默认格式为NV21 。 顺便上午invokin' ffmpeg的是通过Process API和写入预览帧data[]到过程stdin ...的onPreviewFrame()定义如下:

public void onPreviewFrame(byte[] data, Camera camera)
{   
    try
    {
        processIn.write(data);
    }
    catch(Exception e)
    {
        Log.e(TAG, FUNCTION + " : " + e.getMessage());
    }               
    camera.addCallbackBuffer(new byte[bufferSize]);
}

processIn被连接到ffmpeg过程stdinbuffersize是基于提供一种用于对文档的计算addCallbackBuffer() 。 有没有办法,我上来的错东西...?

谢谢...

Answer 1:

多少了解了它完美的工作......这似乎是happenin'是关系到这个错误vcodec图像流的。 似乎ffmpeg的没有提供解码NV21格式的图片或图像流。 对于那些不得不在转换NV21格式的预览框,以JPEG和图像有实时传输到ffmpeg过程中,转换必须是On the Fly 。 对于最近的可靠的解决方案On the Fly转换为JPEG如下:

public void onPreviewFrame(byte[] data, Camera camera)
{
        if(isFirstFrame)
    {
        Camera.Parameters cameraParam = camera.getParameters();
        Camera.Size previewSize = cameraParam.getPreviewSize();
        previewFormat = cameraParam.getPreviewFormat();
        frameWidth = previewSize.width;
        frameHeight = previewSize.height;
        frameRect = new Rect(0, 0, frameWidth, frameHeight);
        isFirstFrame = false;
    }

    previewImage = new YuvImage(data, previewFormat, frameWidth, frameHeight, null);

    if(previewImage.compressToJpeg(frameRect, 50, processIn))
        Log.d(TAG, "Data : " + data.length);

    previewImage = null;

    camera.addCallbackBuffer(new byte[bufferSize]);
}

ffmpeg使用的命令是:

ffmpeg -f image2pipe -vcodec mjpeg -i - -f flv -vcodec libx264 out.flv


文章来源: Android Camera Capture using FFmpeg