[RK3288][Android6.0] 视频编码方式MediaRecorder和MediaCodec
来源:互联网 发布:日本汽车出口数据 编辑:程序博客网 时间:2024/06/05 06:52
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
目录
- MediaRecorder
- 状态机控制
- 编码例子
- MediaCodec
- 工作流
- 使用例子同步
- 参考
- MediaRecorder
系统视频编码有两种方式,使用MediaCodec和MediaRecorder。
MediaRecorder:
- 相对MediaCodec封装得更上层,因此使用相对更简单,但是不能直接处理原始视频数据流了。
- 从Android5.0后可以从除了Camera的其他surface去拿数据,比如屏幕录制视频。
状态机控制:
编码例子:
*frameworks/base/media/tests/mediaframeworktest/src/om/android/
mediaframeworktest/functional/mediarecorder/MediaRecorderTest.java*
private boolean recordVideoFromSurface( int frameRate, int captureRate, int width, int height, int videoFormat, int outFormat, String outFile, boolean videoOnly, Surface persistentSurface) { MediaRecorder recorder = new MediaRecorder();...... recorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); recorder.setOutputFormat(outFormat); recorder.setOutputFile(outFile); recorder.setVideoFrameRate(frameRate); if (captureRate > 0) { recorder.setCaptureRate(captureRate); } recorder.setVideoSize(width, height); recorder.setVideoEncoder(videoFormat);...... recorder.prepare();...... recorder.start();...... recorder.stop(); return true;}
MediaCodec:
- 偏向更底层使用
- Android4.3以后支持
工作流:
使用例子(同步):
MediaCodec codec = MediaCodec.createByCodecName(name); codec.configure(format, …); MediaFormat outputFormat = codec.getOutputFormat(); // option B codec.start(); for (;;) { int inputBufferId = codec.dequeueInputBuffer(timeoutUs); if (inputBufferId >= 0) { ByteBuffer inputBuffer = codec.getInputBuffer(…); // fill inputBuffer with valid data … codec.queueInputBuffer(inputBufferId, …); } int outputBufferId = codec.dequeueOutputBuffer(…); if (outputBufferId >= 0) { ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId); MediaFormat bufferFormat = codec.getOutputFormat(outputBufferId); // option A // bufferFormat is identical to outputFormat // outputBuffer is ready to be processed or rendered. … codec.releaseOutputBuffer(outputBufferId, …); } else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { // Subsequent data will conform to new format. // Can ignore if using getOutputFormat(outputBufferId) outputFormat = codec.getOutputFormat(); // option B } } codec.stop(); codec.release();
参考:
MeidaRecorder
MediaCodec
mediacodec-vs-mediaplayer-and-mediarecorder
mediarecorder-mediacodec-and-ffmpeg
阅读全文
1 0
- [RK3288][Android6.0] 视频编码方式MediaRecorder和MediaCodec
- [RK3288][Android6.0] MediaCodec初始化过程小结
- [RK3288][Android6.0] 一个例子看MediaCodec使用流程
- [RK3288][Android6.0] MediaCodec的configure配置过程小结
- [RK3288][Android6.0] MediaCodec的bitrate_mode配置问题
- [RK3288][Android6.0] SoftMAC和FullMAC区别
- Android MediaCodec 视频编码
- [RK3288][Android6.0] WIFI接入过程的加密和认证方式小结
- [RK3288][Android6.0] 调试笔记 --- 动态显示和隐藏导航栏(广播方式)
- [RK3288][Android6.0] 调试笔记 --- 开机视频无法播放
- [RK3288][Android6.0] 耳机插拔处理两种方式
- [RK3288][Android6.0] 调试笔记 --- AndroidTool两种低格方式
- [RK3288][Android6.0] 如何配置MIPI DSI Clock和PCLK
- [RK3288][Android6.0] 如何配置MIPI DSI Clock和PCLK
- [RK3288][Android6.0] 如何配置MIPI DSI Clock和PCLK
- [RK3288][Android6.0] SystemUI加载过程(状态栏和导航栏)
- [RK3288][Android6.0] WiFi的Firmware和Nvram文件
- [RK3288][Android6.0] 调试笔记 --- Goodix GT9和GT9F区别
- 斐波那契数列
- 一篇很好的大牛面试经验
- 如何从用户对网站的体验度优化网站
- android 从imageloader中取出缓存中的图片
- Android Camera 摄像 demo
- [RK3288][Android6.0] 视频编码方式MediaRecorder和MediaCodec
- 第四章SpringMVC--Controller接口控制器详解 (4)
- 关雎尔:知道什么是适合自己的是一个填坑的过程
- Discuz系统邮件美化
- IntelliJ IDEA 2017 注册方法
- 时间/日期组件使用
- POJ 1849 Two
- FFT在MATLAB画图步骤
- shiro配置及使用 整体流程