Str*_*r33 9 android ffmpeg android-camera
我试着去拍摄Android摄像头生成的预览帧并传递data[]到ffmpeg输入管道来生成一个flv视频.我使用的命令是:
ffmpeg -f image2pipe -i pipe: -f flv -vcodec libx264 out.flv
Run Code Online (Sandbox Code Playgroud)
我也尝试强制输入格式yuv4mpegpipe,rawvideo但没有成功...... android-camera生成的预览帧的默认格式是NV21.invokin'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]);
}
Run Code Online (Sandbox Code Playgroud)
processIn与ffmpeg流程相关联,stdin并buffersize根据提供的文档计算addCallbackBuffer().有什么东西在做错了吗?
谢谢...
有点让它完美运作......似乎发生的错误'与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]);
}
Run Code Online (Sandbox Code Playgroud)
ffmpeg使用的命令是:
ffmpeg -f image2pipe -vcodec mjpeg -i - -f flv -vcodec libx264 out.flv
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6953 次 |
| 最近记录: |