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

谢谢…

  • audiostream不在video中时速度改变命令失败 - ffmpeg
  • WhatsAppvideo作为GIF在编程上共享
  • 正确构建适用于所有Android架构的FFmpeg
  • Android NDK:获取java.lang.UnsatisfiedLinkError:dlopen失败:找不到“libffmpeg.so”引用的符号“signal”
  • Android:同时录制和stream式传输
  • 将FFmpeg与Android-NDK配合使用
  • 在Android-NDK中使用FFmpeg
  • 在android:4.3的MediaMuxer或ffmpeg中通过video添加水印位图
  • 有点得到它的工作完美…似乎发生的错误是与图像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