9

我正在尝试获取 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流程stdinbuffersize根据为 提供的文档进行计算addCallbackBuffer()。有什么做错了吗...?

谢谢...

4

1 回答 1

10

有点让它完美地工作......似乎发生的错误与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
于 2013-03-08T09:31:57.067 回答