尝试'获取Android摄像头生成的预览帧并将data[]
传递给ffmpeg输入管道以生成flv视频。
我使用的命令是:
ffmpeg -f image2pipe -i pipe: -f flv -vcodec libx264 out.flv
我还尝试强制输入格式为yuv4mpegpipe
和rawvideo
,但没有成功......
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()
提供的文档计算得出。
有什么东西在做错了吗?
...谢谢
答案 0 :(得分:8)
有点让它完美运作......
这个错误似乎发生在'与图像流的vcodec
相关。
似乎ffmpeg没有解码NV21
格式图像或图像流的规定。
因此必须将NV21
格式预览框架转换为JPEG
,并且由于图片必须实时流式传输到ffmpeg
进程,因此转换必须为On the Fly
。 On 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