我正在尝试获取安卓摄像头生成的预览帧,并将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 process stdin,并根据为addCallbackBuffer()提供的文档计算buffersize。有什么地方不对劲吗...?
谢谢..。
发布于 2013-03-08 17:31:57
有点让它工作得很完美...似乎正在发生的错误与图像流的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.flvhttps://stackoverflow.com/questions/15280722
复制相似问题