android h264转yuv,Android使用MediaCodec将YUV硬编成H264
MediaCodec原理
MediaCode编码的流程
编码器初始化
创建编码器
codec = MediaCodec.createEncoderByType(MIME);
创建媒体编码格式
MediaFormat format = MediaFormat.createVideoFormat(MIME, videoW, videoH);
format.setInteger(MediaFormat.KEY_BIT_RATE, videoBitrate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, videoFrameRate);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
配置编码器
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
启动编码器
codec.start();
将原始数据提交给编码器
查询编码器可用输入缓冲区索引
int inputBufferIndex = codec.dequeueInputBuffer(-1);
根据输入缓冲区索引获取输入缓冲区
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex);
将编码数据填充到输入缓冲区
inputBuffer.clear();
inputBuffer.put(input);
将填充好的输入缓冲器的索引提交给编码器,注意第四个参数是缓冲区的时间戳,微秒单位,后一帧的时间应该大于前一帧
codec.queueInputBuffer(inputBufferIndex, 0, input.length, System.currentTimeMillis(), 0);
从编码器获取已经编码好的数据
查询编码好的输出缓冲区索引
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0);
根据索引获取输出缓冲区
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferIndex);
从缓冲区获取编码成H264的byte[]
byte[] outData = new byte[outputBuffer.remaining()];
outputBuffer.get(outData, 0, outData.length);
根据输出缓冲区的索引释放该输出缓冲区
codec.releaseOutputBuffer(outputBufferIndex, false);
发送H264给VLC
创建UDP的Socket
socket = new DatagramSocket();
初始化VLC播放器地址
address = InetAddress.getByName(VLC_HOST);
通过UDP,将编码成H264的数据传输给VLC播放器
DatagramPacket packet = new DatagramPacket(data, 0, data.length, address, VLC_PORT);
socket.send(packet);
释放编码器
if (codec != null) {
codec.stop();
codec.release();
codec = null;
}
设置VLC播放器
首先将VLC的去复用模块设置为H264视频去复用器,然后打开网络串流,监听UDP流,具体设置流程如下面图片所示。
示例源码
android h264转yuv,Android使用MediaCodec将YUV硬编成H264相关推荐
- Android MediaCodec硬编码H264文件(四)
在 Android 4.1 版本提供了 MediaCodec 接口来访问设备的编解码器,不同于 FFmpeg 的软件编解码,它采用的是硬件编解码能力,因此在速度上会比软解更具有优势,但是由于 Andr ...
- Android OpenGL ES 学习(十二) - MediaCodec + OpenGL 解析H264视频+滤镜
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式 最近在研究EasyDarwin的Push库EasyPusher,EasyPusher可以推送H264视频到 ...
- 【Android音视频开发】【015】通过MediaCodec和SurfaceView,对H264数据进行解帧和播放
功能点 从连续的字节块中,解析分割出多个H264帧数据 通过MediaCodec解码H264帧 通过SurfaceView播放 代码 //H264数据解析package com.easing.comm ...
- Android 音视频编解码(一) -- MediaCodec 初探
音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...
- android入门视频教程!Android开发者跳槽面试,已拿offer入职
前言 这是"拔剑金九银十"的第二篇文章,本文主要针对3年以上的Android开发者进阶面试中高级开发工程师而整理. 希望可以对你们有所帮助.不多废话,进入正题. 目录: Java中 ...
- android 屏幕录制方案,Android录屏的三种解决方案
本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...
- android 屏幕录制方案,Android录屏的三种方案
本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...
- Android音频录制方案,Android录屏的三种方案
本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...
最新文章
- JQuery 总结(3) jQuery 各种事件
- 物料自运过帐的模拟和修正
- sql 统计每月入职离职人数_入职登记表算合同吗?这里面有大学问
- Unity3d中使用自带动画系统制作下雨效果(一)
- VSCode设置命令行终端为Git
- 支付宝jsapi_使用小程序Serverless开发支付宝小程序
- 报Cannot find /usr/local/tomcat/bin/setclasspath.sh错误
- Golang的简明安装指南
- php 过滤非utf8,PHP如何将不是UTF8的字符过滤掉(代码)
- 【Hoxton.SR1版本】Spring Cloud Gateway之Filter详解
- Java前端技术汇总
- 蓝牙模块的分类和对应的属性特点
- 如何对酒店的固定资产进行日常管理?
- vc中控件字体的设置(转)
- web编程1–用户注册之文本框应用,coon连接,存入mysql
- 论文查重检测系统的原理是什么?
- 基于python+pyqt5的串口助手
- SpringBoot-logback日志管理
- 前端工程化实战 - 开发脚手架
- xcode5 Localized 多语言 本地化
热门文章
- 淘宝API app店铺搜索
- 太阳人人都恨布鲁斯 小斯愤怒:马刺是支肮脏球队
- python 欠采样_欠采样-Python数据科学技术详解与商业项目实战精讲 - python自学网...
- 三星i8268android4.4,三星I8268(移动版)
- CQ40_519TX_XP_SP3系统声卡无声、显卡驱动安装方法
- ESB实现SOA架构
- Google Calendar 跨平台同步方案(随时同步手机与电脑的日程安排)
- 计算机系统导论与计算机导论,计算机系统导论之学习心得.doc
- 【深度学习】跟李沐学ai 线性回归 从零开始的代码实现超详解
- Ubuntu学习 cut