| | |
| | | |
| | | /** |
| | | * 这个采用ImageReader视频帧来获取视频和处理图片 |
| | | * TODO 关闭录像出现mMediaMuxer 异常 |
| | | * */ |
| | | public class Camera2TextureView4 extends TextureView { |
| | | |
| | |
| | | private void startPreview() { |
| | | //启动预览 |
| | | try { |
| | | if(previewThreadHandler == null){ |
| | | initPreviewThreadHandler(); |
| | | } |
| | | mCaptureSession.setRepeatingRequest(previewCaptureBuilder.build(), null, previewThreadHandler); |
| | | } catch (CameraAccessException e) { |
| | | e.printStackTrace(); |
| | |
| | | } |
| | | |
| | | // 提交数据给MediaCodec |
| | | try { |
| | | int inputBufferIndex = mMediaCodec.dequeueInputBuffer(0); |
| | | if (inputBufferIndex >= 0) { |
| | | ByteBuffer inputBuffer = mMediaCodec.getInputBuffer(inputBufferIndex); |
| | |
| | | mMediaMuxer.start(); |
| | | } |
| | | } |
| | | |
| | | while (outputBufferIndex >=0){ |
| | | ByteBuffer outputBuffer = mMediaCodec.getOutputBuffer(outputBufferIndex); |
| | | if (mVideoTrackIndex != -1) { |
| | | |
| | | mMediaMuxer.writeSampleData(mVideoTrackIndex, outputBuffer, bufferInfo); |
| | | } |
| | | |
| | | mMediaCodec.releaseOutputBuffer(outputBufferIndex, false); |
| | | outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0); |
| | | if((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) !=0){ |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | //中断错误,忽略 |
| | | } |
| | | |
| | | }; |
| | |
| | | try { |
| | | previewThread.quitSafely(); |
| | | previewThread.join(); |
| | | previewThread = null; |
| | | previewThreadHandler = null; |
| | | } catch (InterruptedException e) { |
| | | e.printStackTrace(); |
| | | }finally { |
| | | previewThread = null; |
| | | previewThreadHandler = null; |
| | | } |
| | | } |
| | | |