我正在尝试将视频流从Galaxy Tab写入服务器。根据这本手册,我应该做这样的事情:
frontCamera = getFrontCamera();
if((socket!= null)&&(frontCamera!=null))
{
try {
frontCamera.setPreviewDisplay(cameraPreview.getHolder());
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.e("","",e1);
}
frontCamera.startPreview();
recorder = new MediaRecorder();
frontCamera.unlock();
recorder.setCamera(frontCamera);
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setProfile(CamcorderProfile.get( CamcorderProfile.QUALITY_HIGH));
pfd = ParcelFileDescriptor.fromSocket(socket);
recorder.setOutputFile(pfd.getFileDescriptor());
recorder.setPreviewDisplay(cameraPreview.getHolder().getSurface());
try {
recorder.prepare();
recorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
Log.e("","",e);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("","",e);
}
但在步骤CCD_ 1上全部失败,出现奇怪错误
02-01 19:03:39.265: E/MediaRecorder(11922): start failed: -19
这是什么意思?我该怎么启动录音机?
UPD:由于我的getFrontCamera方法,出现了问题。当我用camera.open()替换它时,一切都正常。
protected Camera getFrontCamera()
{
Camera.CameraInfo inf = new Camera.CameraInfo();
for(int i = 0; i< Camera.getNumberOfCameras(); i++)
{
Camera.getCameraInfo(i, inf);
if(inf.facing==Camera.CameraInfo.CAMERA_FACING_FRONT)
{
return Camera.open(i);
}
}
return null;
}
Upd2-是的,明确设置格式和编码器解决了问题-
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
也许是因为预构建格式是用于后置摄像头的。。。但无论如何都很奇怪。
我没有看到输出格式设置,所以尝试添加到记录器设置中:
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
看看
尽管它是流媒体视频,所以设置-
recorder.setOutputFormat(8);
recorder.setOutputFile(socketFd);
玩得开心。
我在这里遇到了一个破解,扩展了媒体记录器类并删除了super.setVideoFrameRate(rate)为我解决了这个问题。
如果您仍然想将CamcorderProfile.QUALITY_HIGH
与前置摄像头一起使用,可以使用以下功能:
CamcorderProfile camcorderProfile = CamcorderProfile.get(currentCameraId, CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(camcorderProfile);
其中int currentCameraId
是Camera.CameraInfo.CAMERA_FACING_BACK
或...FRONT
因此,配置文件确实取决于相机(对于高端手机来说,它似乎可以正常工作,没有区别,因为它们现在都支持1080p,但低端手机可能会崩溃)