使用FFmpeg的Android Camera Capture

时间:2013-03-07 20:07:25

标签: android ffmpeg android-camera

尝试'获取Android摄像头生成的预览帧并将data[]传递给ffmpeg输入管道以生成flv视频。 我使用的命令是:

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

我还尝试强制输入格式为yuv4mpegpiperawvideo,但没有成功...... android-camera生成的预览帧的默认格式为NV21。 调用'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流程stdin相关联,buffersize根据为addCallbackBuffer()提供的文档计算得出。 有什么东西在做错了吗?

...谢谢

1 个答案:

答案 0 :(得分:8)

有点让它完美运作...... 这个错误似乎发生在'与图像流的vcodec相关。 似乎ffmpeg没有解码NV21格式图像或图像流的规定。 因此必须将NV21格式预览框架转换为JPEG,并且由于图片必须实时流式传输到ffmpeg进程,因此转换必须为On the FlyOn 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