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相关推荐

  1. Android MediaCodec硬编码H264文件(四)

    在 Android 4.1 版本提供了 MediaCodec 接口来访问设备的编解码器,不同于 FFmpeg 的软件编解码,它采用的是硬件编解码能力,因此在速度上会比软解更具有优势,但是由于 Andr ...

  2. Android OpenGL ES 学习(十二) - MediaCodec + OpenGL 解析H264视频+滤镜

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  3. EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式

    EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式 最近在研究EasyDarwin的Push库EasyPusher,EasyPusher可以推送H264视频到 ...

  4. 【Android音视频开发】【015】通过MediaCodec和SurfaceView,对H264数据进行解帧和播放

    功能点 从连续的字节块中,解析分割出多个H264帧数据 通过MediaCodec解码H264帧 通过SurfaceView播放 代码 //H264数据解析package com.easing.comm ...

  5. Android 音视频编解码(一) -- MediaCodec 初探

    音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...

  6. android入门视频教程!Android开发者跳槽面试,已拿offer入职

    前言 这是"拔剑金九银十"的第二篇文章,本文主要针对3年以上的Android开发者进阶面试中高级开发工程师而整理. 希望可以对你们有所帮助.不多废话,进入正题. 目录: Java中 ...

  7. android 屏幕录制方案,Android录屏的三种解决方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  8. android 屏幕录制方案,Android录屏的三种方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  9. Android音频录制方案,Android录屏的三种方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

最新文章

  1. JQuery 总结(3) jQuery 各种事件
  2. 物料自运过帐的模拟和修正
  3. sql 统计每月入职离职人数_入职登记表算合同吗?这里面有大学问
  4. Unity3d中使用自带动画系统制作下雨效果(一)
  5. VSCode设置命令行终端为Git
  6. 支付宝jsapi_使用小程序Serverless开发支付宝小程序
  7. 报Cannot find /usr/local/tomcat/bin/setclasspath.sh错误
  8. Golang的简明安装指南
  9. php 过滤非utf8,PHP如何将不是UTF8的字符过滤掉(代码)
  10. 【Hoxton.SR1版本】Spring Cloud Gateway之Filter详解
  11. Java前端技术汇总
  12. 蓝牙模块的分类和对应的属性特点
  13. 如何对酒店的固定资产进行日常管理?
  14. vc中控件字体的设置(转)
  15. web编程1–用户注册之文本框应用,coon连接,存入mysql
  16. 论文查重检测系统的原理是什么?
  17. 基于python+pyqt5的串口助手
  18. SpringBoot-logback日志管理
  19. 前端工程化实战 - 开发脚手架
  20. xcode5 Localized 多语言 本地化

热门文章

  1. 淘宝API app店铺搜索
  2. 太阳人人都恨布鲁斯 小斯愤怒:马刺是支肮脏球队
  3. python 欠采样_欠采样-Python数据科学技术详解与商业项目实战精讲 - python自学网...
  4. 三星i8268android4.4,三星I8268(移动版)
  5. CQ40_519TX_XP_SP3系统声卡无声、显卡驱动安装方法
  6. ESB实现SOA架构
  7. Google Calendar 跨平台同步方案(随时同步手机与电脑的日程安排)
  8. 计算机系统导论与计算机导论,计算机系统导论之学习心得.doc
  9. 【深度学习】跟李沐学ai 线性回归 从零开始的代码实现超详解
  10. Ubuntu学习 cut