争分夺秒的优化--->为了提供极致的视频播放体验 熟悉MediaCodec解码原理的肯定知道, MediaCodec提供了同步模式和异步模式两种模式:
本文基于之前的Demo添加了FFmpeg使用MediaCodec来硬解码的方式,包括解码出buffer再利用OpenGL进行渲染上屏和直接解码到Surface然后上屏两种方式
音视频学习项目:LearnVideo AndroidMediaCodecDemo
熟悉MediaCodec解码原理的肯定知道, MediaCodec提供了同步模式和异步模式两种模式:
在 Android 4.1 版本提供了 MediaCodec 接口来访问设备的编解码器,不同于 FFmpeg 的软件编解码,它采用的是硬件编解码能力,因此在速度上会比软解更具有优势,但是由于 Android 的碎片化问题,机型众多,版本各异,导致 MediaCodec 在机型兼容性上需要花精力去适配,并且编解码流程不可控,全交由厂商的底层硬件去实现,最终得到的视频质量不一定很理想。
1、OpenGL生成纹理 2、纹理绑定到SurfaceTexture上 3、用SurfaceTexture做参数创建Surface 4、MediaCodec解码的视频就往Surface发送,就显示出画面了 Shader编写 vertex_shader.glsl attribute vec4 av_Position; attribute vec2 af_Position; varying vec2 v_texPosition; void main() { v_texPosition = af
初始化MediaCodec private MediaFormat mediaFormat; private MediaCodec mediaCodec; private MediaCodec.BufferInfo info; private Surface surface;//这个是OpenGL渲染的Surface /** * 初始化MediaCodec * * @param codecName * @param width * @param height * @param csd_0
众所周知,MediaCodec 的解码能力不仅可以解码出 YUV 数据,还能直接解码到 Surface 上。
最近公司要求提供一个支持 Android 硬件转码的底层库,所以自己从头去看了 MediaCodec 相关的知识,费了老大的劲终于完成了。
录音采用的是AudioRecord,通过MediaCodec进行编码,用MediaMuxer合成输出MP4文件。
一、短视频内容生产 优质短视频内容的产生依赖于短视频的采集和特效编辑,这就要求在进行短视频源码开发时,用到基础的美颜、混音、滤镜、变速、图片视频混剪、字幕等功能,在这些功能基础上,进行预处理,结合OpenGL、AI、AR技术,产生很多有趣的动态贴纸玩法,使得短视频内容更具创意。
MediaCodec类Android提供的用于访问低层多媒体编/解码器接口,它是Android低层多媒体架构的一部分,通常与MediaExtractor、MediaMuxer、AudioTrack结合使用,能够编解码诸如H.264、H.265、AAC、3gp等常见的音视频格式。广义而言,MediaCodec的工作原理就是处理输入数据以产生输出数据。具体来说,MediaCodec在编解码的过程中使用了一组输入/输出缓存区来同步或异步处理数据:首先,客户端向获取到的编解码器输入缓存区写入要编解码的数据并将其提交给编解码器,待编解码器处理完毕后将其转存到编码器的输出缓存区,同时收回客户端对输入缓存区的所有权;然后,客户端从获取到编解码输出缓存区读取编码好的数据进行处理,待处理完毕后编解码器收回客户端对输出缓存区的所有权。不断重复整个过程,直至编码器停止工作或者异常退出。
大家好,本文是 iOS/Android 音视频开发专题 的第八篇,该专题中 AVPlayer 项目代码将在 Github 进行托管,你可在微信公众号(GeekDev)后台回复 资料 获取项目地址。
优质短视频内容的产生依赖于短视频的采集和特效编辑,这就要求在进行抖音APP开发时,用到基础的美颜、混音、滤镜、变速、图片视频混剪、字幕等功能,在这些功能基础上,进行预处理,结合OpenGL、AI、AR技术,产生很多有趣的动态贴纸玩法,使得短视频内容更具创意。
Android音视频编码分为软编和硬编两种。所谓的硬编是用设备GPU去实现编解码,从而减轻CPU的压力,让程序更加的健壮,自然而然你就知道了软编其实就是让CPU编码(其实是在c层通过c/c++进行编码,之所以这样是因为c/c++平台上已经有很多比较好的音视频编解码库。比如著名ffmpeg,搞过音视频的相信对这个库绝对不会陌生)。那么或许你心目中有一个小小的疑问?为什么要编解码了?原因就是让数据更小便于传输。编解码就好比是压缩与解压!本文是把PCM数据硬编成ACC格式数据。如果对音频的采集不熟悉,请查阅Android 音频采集。
大家好,本文是 iOS/Android 音视频开发专题 的第三篇,从本篇开始进入 Android 音视频专题实战篇。如果你对 iOS/Android 音视频开发感兴趣可通过关注本公众号 GeekDev 第一时间获取推送。
YUV是为了解决彩色电视与黑白电视的兼容性。黑白视频只有Y值,也就是灰度。而彩色电视则有YUV3个分量,如果只读取Y值,就只能显示黑白画面了。YUV最大的优点在于只需占用极少的带宽。
MediaCodec 是Android 4.1(api 16)版本引入的编解码接口,同时支持音视频的编码和解码。
这是MediaCodeC系列的第三章,主题是如何使用MediaCodeC将图片集编码为视频文件。在Android多媒体的处理上,MediaCodeC是一套非常有用的API。此次实验中,所使用的图片集正是MediaCodeC硬解码视频,并将视频帧存储为图片文件文章中,对视频解码出来的图片文件集,总共332张图片帧。 若是对MediaCodeC视频解码感兴趣的话,也可以浏览之前的文章:MediaCodeC解码视频指定帧,迅捷、精确
Media内核是Android系统中负责音视频处理的核心模块,包括音视频采集、编解码、传输、播放等功能。Media内核源码位于Android源码树的/frameworks/av目录下,主要包括以下模块:
说到Android的视频硬编码,很多新人首先会想到MediaRecorder,这可以说是Android早期版本视频硬编码的唯一选择。这个类的使用很简单,只需要给定一个Surface(输入)和一个File(输出),它就给你生成一个标准的mp4文件。 但越是简单的东西便意味着越难以控制,MediaRecorder的缺点很明显。相信很多人在接触到断点视频录制这个需求的时候,首先会想到使用MediaRecorder,很遗憾,这个东西并不能给你很多期待,就像一开始的我一样。 首先,MediaRecorder并没有断点录制的API,当然你可以使用一些“小技巧”,每次录制的时候,都把MediaRecorder stop掉,然后再次初始化,这样就会生成一系列的视频,最后把它们拼接起来。然而问题在于,每次初始化MediaRecorder都需要消耗很长时间,这意味着,当用户快速点击录制按钮的时候可能会出现问题。对于这个问题,你可以等到MediaRecorder初始化完成才让用户点击开始录制,但是这样往往会因为等待时间过长,导致用户体验极差。 这种情况下,一个可控的视频编码器是必须的。虽然在Android 4.4以前我们没得选择,但是在Android 4.4之后,我们有了MediaCodec,一个完全可控的视频编码器,虽然无法直接输出mp4(需要配合MediaMuxer来对音视频进行混合,最终输出mp4,或者其它封装格式)。如今的Android生态,大部分手机都已经是Android 5.0系统,完全可以使用MediaCodec来进行音视频编码的开发,而MediaRecorder则降级作为一个提高兼容性的备选方案。 废话不多说,我们直接步入正题。要想正确的使用MediaCodec,我们首先得先了解它的工作流程,关于这个,强烈大家去看一下Android文档。呃呃,相信在这个快速开发为王道的环境,没几个人会去看,所以还是在这里简单介绍一下。
播放一个音视频文件的时候,我们知道需要经过解协议->解封装->解码音频/视频->音频/视频同步->渲染播放这几个步骤,其中解码音频/视频是整个流程中最核心的一个环节.每个步骤的详细解释可以参考上篇文章Android中如何使用OpenGL播放视频 Android平台下解码音视频可以采用软件解码如ffmpeg,或使用硬件解码如MediaCodec来实现软件解码:利用CPU进行解码处理,这种方式会加大CPU负担并增加功耗,它的优点则是具有更强的适配性;硬件解码:调用GPU的专门解码音视频的模块来处理,减少CPU运算,降低功耗.由于Android机型碎片化比较严重,硬件解码的实现又依赖于具体的厂商,所以硬件解码的适配性并不是那么友好一般而言,在Android设备支持硬解的情况下优先使用Android设备的硬件解码,减少CPU占用,降低功耗;在硬解不支持的情况下选择使用软解码,至少让音视频能正常播放. 软硬结合,才是王道->_-> 当然,本篇文章所描述的是使用硬件解码MediaCodec的方式来解码一个视频文件. MediaCodec简介 android.media.MediaCodec是从API16开始由Android提供的供开发者能更加灵活的处理音视频的编解码组件,与MediaPlayer/MediaRecorder等high-level组件相比,MediaCodec能让开发者直接处理具体的音视频数据,所以它是low-level API它通常与MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTrack一起使用. 基本架构
在上一章我们讲到了MediaCodec的工作流程,以及如何利用MediaCodec进行H264编码。这一章的内容同样是MediaCodec,只不过是编码音频为AAC,整个流程大同小异。 上一章我们利用MediaCodec编码视频时,使用了Surface,所以可以不直接操作输入缓冲区队列。但是编码音频的时候,由于无法使用Surface,所以需要直接操作输入缓冲区队列。 这里我们需要通过AudioRecord采集PCM数据,然后把采集到的数据送进编码器进行编码。所以首先我们要初始化一个AudioRecord对象。 要使用录音,需要申请录音权限。
硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等
音频录制 相关参考 MediaCodec硬编码pcm2aac 主要分为以下几步骤:
大家好,本文是 iOS/Android 音视频开发专题 的第七篇,该专题中 AVPlayer 项目代码将在 Github 进行托管,你可在微信公众号(GeekDev)后台回复 资料 获取项目地址。
接上篇我们继续聊一下VideoEditor中视频导出,这次我们谈谈【如何优化视频导出的速度】,视频的导出速度算是VideoEditor的一个非常重要的衡量指标,如何导出速度太慢了,那么VideoEditor肯定是流失相当一部分用户的。本文关于视频导出速度的优化都是经过实践证明过的,非常具有参考意义。
https://engineering.linkedin.com/blog/2019/litr-a-lightweight-video-audio-transcoder-for-android
本文实例为大家分享了Android使用MediaCodec将摄像头采集的视频编码为h264,供大家参考,具体内容如下
大家好,本文是 iOS/Android 音视频专题 的第四篇,从本篇文章开始我们将动手编写代码。代码工程将在 Github 进行托管。
越来越多的App需要共享手机屏幕给他人观看,特别是在线教育行业。Android 从5.0开始支持了MediaProjection,利用MediaProjection ,可以实现截屏录屏功能。
最近开发的新版程序初版基本差不多了,所以抽空需要研究一下针对运维方便的辅助工具,其中就有需要做一个WIndows服务器可以远程控制Android客户端的工具,实现的原理大概已经有了个思路了,拆解后每个细节就需要去做技术验证,远程控制首先就需要做到看到对面的图像,预览图像就要使用录屏的功能,所以就有了这个小Demo,当然最终要做的东西是不需要保存本地视频的,这里是为了验证一下是否成功。
在前面Android平台下使用FFmpeg进行RTMP推流(摄像头推流)的文章中,介绍了如何使用FFmpeg进行H264编码和Rtmp推流。接下来讲分几篇文章来介绍如何使用Android系统的MediaCodec进行H264硬编码,然后封装推流。这一块涉及的内容很多,其中涉及一些基础知识也会有单独文章介绍比如flv格式。这篇文章主要介绍如何用MediaCodec进行编码,然后将编码后的数据进行flv封装。
自由与开源软件的理念,从不解、争议、接受到如今如火如荼,经历了长期的历程。国内开源软件起步较晚,但进展迅速。腾讯经过几年的开源协同运动,也取得了不少成绩。其中,腾讯云音视频在FFmpeg、SRS等重要多媒体开源社区的贡献,颇具代表性。 FFmpeg是音视频领域最著名的开源项目之一,被誉为多媒体领域的瑞士军刀,是众多音视频业务的基石。FFmpeg 6.0版本以代号Von Neumann在2月28号发布,这一版本包含了大量重要更新,其中就有腾讯云音视频团队贡献的众多有趣且颇具价值的特性。除FFmpeg外,腾讯云
本文介绍了如何利用mediacodec解码和opengl渲染实现滤镜效果,包括黑白滤镜、颜色滤镜、暖色冷色滤镜以及马赛克滤镜。通过实例代码展示了如何实现这些滤镜效果,为开发者在实现视频滤镜功能时提供了一定的参考。"
通过fbo处理视频数据,通过samplerExternalOES纹理来创建SurfaceTexture,这样的话摄像头数据就和fbo相关联,具体可以看OpenGLES通过SurfaceTexture预览摄像头画面
原文:https://engineering.linkedin.com/blog/2019/litr-a-lightweight-video-audio-transcoder-for-android
MediaCodec 有两种方式触发输出关键帧,一是由配置时设置的 KEY_FRAME_RATE 和KEY_I_FRAME_INTERVAL参数自动触发,二是运行过程中通过 setParameters 手动触发输出关键帧。
上一篇《Android制作带悬浮窗控制的录屏程序Demo》我自己用的虚拟机是Android8的版本,后来用自己的手机无法使用,原因是在Android 10之后录屏等功能要求在前台Service中进行,所以如果你的设备是Android 10以上的 ,上一篇中的录屏就不能用了,所以这篇是专门针对Android 10录屏做的改动。
本文主要介绍了如何在移动端GPU上对视频进行高效的编码与解码,通过对比多种编码方式、使用GPU对视频进行硬件加速、利用GPU对视频进行实时处理、以及对视频进行高效压缩与解码,最终实现了在移动端GPU上对视频进行高效编码与解码的解决方案。
Android的视频相关的开发,大概一直是整个Android生态,以及Android API中,最为分裂以及兼容性问题最为突出的一部分。摄像头,以及视频编码相关的API,Google一直对这方面的控制力非常差,导致不同厂商对这两个API的实现有不少差异,而且从API的设计来看,一直以来优化也相当有限,甚至有人认为这是“Android上最难用的API之一” 以微信为例,我们录制一个540p的mp4文件,对于Android来说,大体上是遵循这么一个流程: ---- ---- 大体上就是从摄像头输出的YUV帧
Codec2是Android中多媒体相关的软件框架,是MediaCodec的中间件,往上对接MediaCodec Native层,往下提供新的API标准供芯片底层的编解码去实现,也就是说适配了Codec2,就可以通过MediaCodec来调用芯片的硬件编解码的能力,来完成一些多媒体相关的功能。这篇文章先从下到上讲解适配Codec2需要实现的接口,然后再从上到下分析MediaCodec的流程来分析这些接口是如何调用的。主要抓住以下两条主线
MediaCodec编码的套路 状态 来自官网的状态图 codec_status.png 创建 find Support Codec 通过这种方式可以得到当前设备所有的MedaCodecInfo
本篇开始讲解在Android平台上进行的音频编辑开发,首先需要对音频相关概念有基础的认识。所以本篇要讲解以下内容:
随着短视频的流行,用户在碎片化场景下消费的视频内容越来越多。短视频本身时长较短,首帧体验尤为重要。随着预加载、预下载、IP直通车等传统优化手段使用,首帧体验有了明显提升。但经过进一步的数据分析,在手Q中长尾中低端机上,首帧表现依然不够理想。首帧优化已经进入深水区,受Google ExoPlayer切换清晰度方案(不用重启解码器)的启发,我们探索出一种适合短视频场景的,基于Android平台的跨播放器解码器复用方案,对中低端机首帧性能提升明显。本文是对整体方案的介绍,希望能帮助大家在首帧优化方向上提供新的思
MediaCodec的相关数据时间单位为(纳秒/1000),类似610,729,613,772, 倒数第7位代表秒级
领取专属 10元无门槛券
手把手带您无忧上云