我正在使用SurfaceView
显示我的智能手机上的无人机流,我想要的是记录无人机的流,但这并不容易。所以我想我可以使用MediaRecorder
。对于这个问题,我已阅读了很多帖子,但他们并没有帮助我。
在OnCreate
我正在创建SurfaceView
:
mPreview = FindViewById<SurfaceView>(Resource.Id.surfaceView1);
holder = mPreview.Holder;
holder.AddCallback(this);
holder.SetFormat(Format.Rgba8888);
在SurfaceCreated
覆盖中,我添加了SetPreviewDisplay
:
mRecorder = new Android.Media.MediaRecorder();
mRecorder.SetPreviewDisplay(mPreview.Holder.Surface);
因此,当我点击记录按钮时,我在新线程中启动以下方法,否则SurfaceView
将被卡住:
private void StartRecord()
{
var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
string path = System.IO.Path.Combine(sdCardPath, "test.mp4");
file = new File(path);
mRecorder.SetVideoSource(Android.Media.VideoSource.Surface);
mRecorder.SetOutputFormat(Android.Media.OutputFormat.Mpeg4);
mRecorder.SetVideoEncoder(Android.Media.VideoEncoder.H264);
mRecorder.SetVideoEncodingBitRate(512 * 1000);
mRecorder.SetVideoFrameRate(30);
mRecorder.SetOutputFile(file.AbsolutePath);
mRecorder.SetVideoSize(mPreview.Width, mPreview.Height);
mRecorder.Prepare();
mRecorder.Start();
}
在调用mRecorder.Stop()
之前没有错误:
private void StopRecord()
{
if(mRecorder != null)
{
try
{
mRecorder.Stop();
}
catch (Java.Lang.RuntimeException e)
{
// Here he always comes
file.Delete();
System.Console.WriteLine(e);
}
finally
{
mRecorder.Release();
mRecorder = null;
}
}
}
当我检查mRecorder
变量时,它在表面对象上说:failed to get surface
。这很奇怪,因为当我在mRecorder
开始后检查mRecorder
变量时,它只有一个表面对象。
我做错了什么?