我正在尝试修改链接到此处的示例代码,这将使用Xamarin录制视频:http://developer.xamarin.com/recipes/android/media/video/record_video/
具体来说,我正在尝试设置视频大小,因此我修改了StartRecorder
方法以指定支持的视频大小:
private void StartRecorder()
{
try
{
_video.StopPlayback();
recorder = new MediaRecorder();
recorder.SetVideoSource(VideoSource.Camera);
recorder.SetAudioSource(AudioSource.Mic);
recorder.SetOutputFormat(OutputFormat.Default);
// get suppored video sizes
var camera = Android.Hardware.Camera.Open();
var cameraParameters = camera.GetParameters();
var supportedSizes = cameraParameters.SupportedVideoSizes;
// set video size to a suppored size
// comment this out and it works
recorder.SetVideoSize(supportedSizes[0].Width, supportedSizes[0].Height);
recorder.SetVideoEncoder(VideoEncoder.Default);
recorder.SetAudioEncoder(AudioEncoder.Default);
recorder.SetOutputFile(_path);
recorder.SetPreviewDisplay(_video.Holder.Surface);
recorder.Prepare();
recorder.Start(); // fails with IllegalStateException
}
catch (Exception ex)
{
// IllegalStateException thrown
// error message is "start failed"
}
}
根据API specification我认为我正确使用它,但我看不出为什么我无法设置视频大小。
我这样做错了吗?有什么我想念的吗?我应该这样做吗?
答案 0 :(得分:1)
以下代码适用于我的设备(galaxy S5):
var camera = Android.Hardware.Camera.Open();
var cameraParameters = camera.GetParameters();
var supportedSizes = cameraParameters.SupportedVideoSizes;
var supportedPreviewSizes = cameraParameters.SupportedPreviewSizes;
camera.SetPreviewDisplay(video.Holder);
camera.StartPreview();
camera.Unlock();
recorder = new MediaRecorder();
recorder.SetCamera(camera);
recorder.SetVideoSource(VideoSource.Camera);
recorder.SetAudioSource(AudioSource.Camcorder);
recorder.SetOutputFormat(OutputFormat.Mpeg4);
recorder.SetVideoSize(supportedSizes[0].Width, supportedSizes[0].Height);
recorder.SetVideoEncoder(VideoEncoder.Mpeg4Sp);
recorder.SetAudioEncoder(AudioEncoder.AmrNb);
recorder.SetPreviewDisplay(video.Holder.Surface);
recorder.SetOutputFile(path);
recorder.Prepare();
recorder.Start();
这里有关于通话订单的一些信息: http://developer.android.com/guide/topics/media/camera.html#capture-video
确实说Android 4上不再需要解锁,因此我不确定此示例中的所有呼叫是否实际都是必需的。在 SetVideoEncoder 之前调用 SetVideoSize 非常重要,但在您链接的API文档页面中未明确提及 - 您的示例代码已经这样做了无论如何:)。
我想您代码中缺少的最值得注意的一行是:
recorder.SetCamera(camera);
答案 1 :(得分:0)
除了你错过" recorder.SetCamera(相机);"
从CameraParameters.h中的解释
如果getSupportedVideoSizes()返回Size的空向量,则不能调用setVideoSize。即使getSupportedVideoSizes()检索支持的视频大小的Vector,但当摄像机只有一个输出大小时,它可以返回一个空矢量。
因此,您应首先检查supportedPreviewSizes是否为空,如果为空,则不得调用SetVideoSize()。