使用FFmpeg进行Android相机捕获

9

我正在尝试获取由Android相机生成的预览帧,并将data[]传递给ffmpeg输入管道,以生成FLV视频。 我使用的命令是:

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

我曾试图强制输入格式为yuv4mpegpiperawvideo,但没有成功...... 由android-camera生成的预览帧的默认格式是NV21。 我通过Process API调用ffmpeg,并将预览帧的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() 的文档计算而来。

我是否做错了什么...?

谢谢...


你能解释一下如何使用进程 API 调用 ffmpeg 进程吗? - dy_
永远不要尝试使用camera.addCallbackBuffer(new byte[bufferSize]):你应该返回(即addCallbackBuffer())从相机回调中接收到的数据数组。 - Alex Cohn
1个回答

10

基本上把它完美地运作起来了... 看起来出错的问题与图像流的 vcodec 有关。 似乎 ffmpeg 没有提供解码 NV21 格式图像或图像流的选项。 为此,必须将 NV21格式的预览帧转换为 JPEG,并且由于这些图像必须在实时流到 ffmpeg 进程中,所以转换必须是 即时 进行的。最接近的可靠解决方案是进行 即时 转换为 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

你好,能分享一下你的代码吗?我想知道你是如何使用 processIn 的。谢谢。 - suitianshi
当我使用静态构建的ffmpeg尝试运行此代码时,Android提示不支持“mjpeg”格式。有什么解决办法吗? - Parth Doshi
你在 Android 上使用静态构建的 ffmpeg 运行了命令,还是在桌面上尝试了这个命令? - Parth Doshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接