我正在尝试使用 Android Media Recorder 记录持久 Surface,我的代码有时可以正常工作,但大多数情况下,在调用媒体记录器类的 .prepare() 方法后,我得到了 Io 异常.. 我尝试更改视频编解码器、帧速率和许多其他内容,但我找不到它的解决方案.. 我花了 2 天的时间来解决这个问题,并且仍在寻找 .. 如果有人遇到同样的问题,请回复 .. 任何形式的帮助都是非常可观的
这是用于初始化记录器的代码
public void initRecorder(File saveToFile, int displayWidth, int displayHeight,
int desiredWidth, int desiredHeight, int orientationHint,
MediaRecorder.OnErrorListener errorListener,
MediaRecorder.OnInfoListener infoListener)
throws IOException {
if(mMediaRecorder==null)
{
MediaRecorder mediaRecorder = new MediaRecorder();
mediaRecorder.setOnInfoListener(infoListener);
mediaRecorder.setOnErrorListener(errorListener);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
if(mSurface==null)
{
Log.d("Surface_test>>","Surface Is Null");
}else {
Log.d("Surface_test>>","Surface Is NOT >>>>>>>>>>. Null");
mediaRecorder.setInputSurface(mSurface);
}
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setAudioSamplingRate(44100);
mediaRecorder.setAudioEncodingBitRate(96000);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoEncodingBitRate(12000000);
mediaRecorder.setVideoFrameRate(30);
if(desiredWidth > desiredHeight){
float desiredAspect = 1080.0f / 2280.0f;
if(desiredWidth > 2280 || desiredHeight > 1080){
float aspect = (float) desiredHeight / desiredWidth;
if(aspect > desiredAspect){
desiredHeight = 1080;
desiredWidth = (int) Math.floor(desiredHeight / aspect);
} else {
desiredWidth = 2280;
desiredHeight = (int) Math.floor(desiredWidth * aspect);
}
}
} else {
float desiredAspect = 2280.0f / 1080.0f;
if(desiredWidth > 1080 || desiredHeight > 2280){
float aspect = (float) desiredHeight / desiredWidth;
if(aspect > desiredAspect){
desiredHeight = 2280;
desiredWidth = (int) Math.floor(desiredHeight / aspect);
} else {
desiredWidth = 1080;
desiredHeight = (int) Math.floor(desiredWidth * aspect);
}
}
}
mediaRecorder.setVideoSize(mDesiredHeight, mDesiredWidth);
mediaRecorder.setOrientationHint(orientationHint);
Log.d("Recording_Debug>>","File Path>>"+saveToFile.getAbsolutePath());
mediaRecorder.setOutputFile(saveToFile.getAbsolutePath());
try {
mediaRecorder.prepare();
}catch (Exception e)
{
Log.d("Recording_Debug>>",e.toString());
}
mMediaRecorder = mediaRecorder;
}else {
Log.d("Recording_Debug","ALreday Initialized");
}
}
尝试一些方法,我发现当我在下面评论时
mediaRecorder.setVideoSize(mDesiredHeight, mDesiredWidth);
我可以录制视频,但其纵横比不正确
我使用硬编码的维度,如
mediaRecorder.setVideoSize(640, 480);
这也不起作用