android Camera2 录像 TextureView 异常 困扰两天了 求大佬指点

回忆与我都不爱说话 2018-04-16 05:25:12
异常
java.lang.IllegalStateException: failed to get surface
at android.media.MediaRecorder.getSurface(Native Method)

代码

/**
* 开始视频录制。
*/
private void startRecordingVideo() {
isRecordingVideo = true;
SurfaceTexture mSurfaceTexture = tv.getSurfaceTexture();
//设置TextureView的缓冲区大小
mSurfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
List<Surface> surfaces = new ArrayList<>();
Surface previewSurface = new Surface(mSurfaceTexture);
surfaces.add(previewSurface);
//获取Surface显示预览数据
setUpMediaRecorder();


try {
mCaptureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
// 设置自动对焦模式
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
//设置Surface作为预览数据的显示界面
mCaptureRequestBuilder.addTarget(previewSurface);
Surface mSurface = mMediaRecorder.getSurface();-------这里崩溃
surfaces.add(mSurface);
mCaptureRequestBuilder.addTarget(mSurface);

cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
mPreviewSession = cameraCaptureSession;
mCaptureRequest = mCaptureRequestBuilder.build();

try {
mPreviewSession.setRepeatingRequest(mCaptureRequest, null, childHandler);
mMediaRecorder.start();
} catch (CameraAccessException e) {
e.printStackTrace();
}
}

@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {

}
}, childHandler);

} catch (CameraAccessException e) {
e.printStackTrace();
}

}


/**
* 设置媒体录制器的配置参数
* <p>
* 音频,视频格式,文件路径,频率,编码格式等等
*
* @throws IOException
*/
private void setUpMediaRecorder() {

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
String videoPath = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/";

mMediaRecorder.setOutputFile(videoPath);
//设置视频编码比特率
mMediaRecorder.setVideoEncodingBitRate(10000000);
//每秒30帧
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(previewSize.getWidth(), previewSize.getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
int rotation = getWindowManager().getDefaultDisplay().getRotation();
if ("1".equals(mCameraId)) {
rotation = 2;
} else {
rotation = 0;
}
mMediaRecorder.setOrientationHint(ORIENTATIONS.get(rotation));
try {
mMediaRecorder.prepare();
printLog("录像准备");
} catch (IOException e) {
e.printStackTrace();
}
}
...全文
1996 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
键盘舞者113 2018-04-18
  • 打赏
  • 举报
回复
项目上传,链接给我
cocoabird 2018-04-18
  • 打赏
  • 举报
回复
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
  • 打赏
  • 举报
回复
引用 5 楼 qq_20330595 的回复:
貌似是加载顺序 或者 关闭录制时 资源未及时释放的问题  SurfaceTexture mSurfaceTexture = tv.getSurfaceTexture(); mSurfaceTexture  可能被重复添加了 mSurfaceTexture移除一下父布局试试
你好 能说明白点吗?一处父类布局??
  • 打赏
  • 举报
回复
在做别的 继续回来看这个问题 还没有解决
千斤神力王 2018-04-17
  • 打赏
  • 举报
回复
我要瞎了,堆栈太小完全看不见
  • 打赏
  • 举报
回复
没搞明白 不知道哪里错了
键盘舞者113 2018-04-17
  • 打赏
  • 举报
回复
Android 音视频深入 五 Android原生API完美的录视频(附源码下载) https://blog.csdn.net/z979451341/article/details/79245855
  • 打赏
  • 举报
回复
来为大神帮忙看一下
Android小码家 2018-04-17
  • 打赏
  • 举报
回复
貌似是加载顺序 或者 关闭录制时 资源未及时释放的问题  SurfaceTexture mSurfaceTexture = tv.getSurfaceTexture(); mSurfaceTexture  可能被重复添加了 mSurfaceTexture移除一下父布局试试

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧