使用FFmpeg进行Android相机捕获

我试着采取Android摄像头生成的预览帧,并将data[]传递给ffmpeginputpipe道以生成flvvideo。 我使用的命令是:

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

我也试图强制input格式为yuv4mpegpiperawvideo但没有成功… android-camera生成的预览帧的默认格式是NV21 。 invokein'ffmpeg的方法是通过Process API并将预览帧data[]写入进程的stdinonPreviewFrame()定义如下:

 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()提供的文档计算。 有没有什么是做错了…?

谢谢…

Solutions Collecting From Web of "使用FFmpeg进行Android相机捕获"

有点得到它的工作完美…似乎发生的错误是与图像stream的vcodec有关。 似乎ffmpeg没有规定解码NV21格式的图像或图像stream。 为此,必须将NV21格式的预览帧转换为JPEG并且由于图像必须实时传输到ffmpeg过程,转换必须On the Fly 。 “ On the Fly转换为JPEG ”最可靠的解决scheme如下:

 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