![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android音视频
文章平均质量分 81
Android音视频相关
丞恤猿
人生就如西西弗斯推石头上山:
while(true){
滚下来();
推上去();
}
展开
-
常见直播协议介绍:RTMP、HTTP-FLV、HLS
#.推流协议:1.RTMP协议(Real Time Message Protocol,实时信息传输协议) 由Adobe公司提出的一种应用层的协议,可用于实时传递音视频媒体数据。它基于传输层的TCP协议,通过与服务端建立长连接来传递数据。相较于其它同类协议,传输稳定,延迟较低,一般在1~3s,非常适合用于直播场景下的推流。 当前手机app端只要是使用该协议来推流。1.1 RTMPS: RTMP的变种,使用HTTPS协议来传输数据,支持数据加密。(可使用Rtmpdump库...原创 2022-05-14 20:13:13 · 9212 阅读 · 0 评论 -
Android 视频直播的流程总览
视频直播整个流程,就是不断把数据采集端的数据编码后推送到流媒体服务器,经CDN加速后,由播放端拉取这些数据进行解码播放。 在手机客户端主要可分为五个步骤:音视频数据采集、音视频效果处理、数据编码、推流到服务器、拉流播放。(整个过程类似于源源不断送快递,推流端是生产方,生产的货物送到库房(流媒体服务器),由专业的快递公司(CDN),快速送到各个消费者手中(拉流播放端)。没有快递公司当然也能送货,但货物太多、距离太远,送货速度就会慢。)#.Android客户端的主要...原创 2022-05-13 22:48:11 · 1369 阅读 · 0 评论 -
Android 使用MediaProjection+ImageReader捕捉屏幕画面
#.简介 Android5.0以后提供了MediaProjectionManager系统服务来获取手机屏幕画面。 需要获取相应服务的权限,然后创建虚拟显示器,物理屏幕画面会不断被投影到虚拟现实器,输出到创建虚拟显示器时设置的Surface上。使用过程一般会结合ImageReader或OpenGL来进行。 (在更低的版本,如Android4.4,获取屏幕画面需要通过ADB指令来进行。但目前市面上基本已经见不到比Android5.0版本还低的安卓手机)#.基本使用...原创 2022-05-13 18:28:44 · 4508 阅读 · 0 评论 -
Android IjkPlayer API介绍
##.简介IjkPlayer是Bilibili推出的一个开源播放器库,很多视频平台都在使用,底层是基于ffmpeg来实现的。官方的github地址:GitHub - bilibili/ijkplayer: Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.开源库中封装了IMediaPlayer接口,包括一个播放器正常需要的绝大部分功能。在开源库中为该接口提供几种实现方式,原创 2022-05-12 22:21:04 · 1061 阅读 · 0 评论 -
Android使用RtmpDump进行RTMP推流介绍
目前Android端APP视频直播一般使用RTMP协议推流到流媒体服务器,通过CDN加速后,然后在播放端通过HTTP-FLV协议或HLS协议拉流播放。#RTMP协议介绍RTMP协议(Real Time Message Protocol,实时信息传输协议),是由Adobe公司提出的一种应用层的协议,可用于实时传递音视频媒体数据。它基于传输层的TCP协议,通过与服务端建立长连接来传递数据。相较于其它同类协议,延迟较低,一般在1~3s,非常适合用于直播场景下的推流。...原创 2022-05-12 21:49:32 · 2792 阅读 · 0 评论 -
Android MediaMuxer合成视频文件
#.简介MediaMuxer在Android中可以将编码后的视频、音频数据封装后输出为多媒体文件,支持的文件输出格式包括MP4,webm和3gp。不过MediaMuxer中最多只能添加一条视轨和一条音轨。一般音视频编码由MediaCodec负责,而MediaMuxer处理MediaCodec输出的编码数据,合成多媒体文件。#主要API1.public MediaMuxer(@NonNull String path, @Format int format)原创 2022-05-11 23:14:53 · 1213 阅读 · 0 评论 -
Android用AudioRecord+MediaCodec采集音频和音频编码 & 音频一些基本概念
#.音频的一些相关概念简介0.整体介绍 声波是一种机械波,我们听到声音,是因为耳朵鼓膜接收到了声波,然后听觉神经做了相应处理。 机械波有震动频率和震动幅度,对于频率和振幅恒定的声波,若以时间为x值,声波振幅为y值,则在坐标系中绘制出的会类似一条正弦函数曲线。不过现实中都是多个声源进行各种复杂的震动,最终的震动波形是很多简单正弦波形相叠加的结果。 计算机中只能存储离散的数据,所能做的只是周期性的采样声波震动数据,然后播放时尽可能地还原出原来的声波效果。原创 2022-05-11 22:01:44 · 1499 阅读 · 0 评论 -
Android使用MediaCodec进行视频编码 & 视频的一些基础概念介绍
#.视频的一些相关概念简介1.图像的分辨率 描述一张图片中的像素数量,一般用像素宽度*像素高度表示。 摄像头采集的画面是一堆像素点拼接成的,一个像素点可以理解成组成图像的一个色块,大量的色块合在一起就基本能还原出现实中的画面。每个像素点在存储中都记录了对应的颜色特点,具体大小跟颜色格式祥光,例如RGB格式是占用3个byte。 2.视频的帧率(FPS) 我们看到的视频是一张张画面快速切换,在人眼和视觉神经中形成的动态感受,人们感知那是连续不断变化的。...原创 2022-05-11 17:24:57 · 3228 阅读 · 0 评论 -
Android MediaCodec简单总结
#.MedaiCodec简介 MediaCodec是Android中提供的音视频编码、解码工具。它主要是完成上层接口的封装,提供给开发者使用,编解码功能实际是在native底层服务中完成的。#.MediaCodec工作的宏观流程:##.包换两个缓冲区队列一个输入缓冲区队列,包含一组输入缓冲区(格式ByteBuffer);一个输出缓冲区队列,包含一组输出缓冲区(格式ByteBuffer);##.使用中,需要不断重复以下过程:1.把原始数据放入输入缓冲区队列中一个..原创 2022-05-10 21:07:48 · 5926 阅读 · 0 评论 -
Android相机(Camera)使用总结及代码示例
#.Android中Camera1使用主要流程:开启相机使用的关键步骤:0.获取相应权限1.检查相机可用性2.遍历相机列表,打开指定方向(前置/后置)相机,获取对应实例对象3.设置预览参数4.设置预览画面偏转方向5.设置预览画面输出方式6.开启预览结束相机使用的关键步骤:1.关闭对应相机预览2.释放对应相机资源##.一些要点1.摄像头相关回调执行的线程Camera.open([index])会启动相应的摄像头,并返回其实例对象。该方法在哪原创 2022-05-10 17:37:29 · 2876 阅读 · 0 评论 -
Android中相机(Camera)画面旋转角度分析:手机摄像头的“正向”、手机画面自然方向、相机画面的偏转角度
#.概述: 1.如同人眼看东西分上下一样,摄像头也有其“正向”,正常情况下,Android手机后置、前置摄像头的“正向”朝向为手机的“右侧”(默认如此,除非手机厂商修改设置)。(这里运行代码做过测试发现,前置摄像头也是以右侧为正向,而不是有些资料上说的左侧。) 摄像头直接返回的画面,都是以此方向为作为画面的上方向。若不加处理,直接存储到手机中或展示到View中,画面很可能不“正确”。这里的“正确”指界面存储/展示的图像方向,与摄像头拍摄时人肉眼看到的画面方向一致。 ...原创 2022-05-10 17:21:05 · 9562 阅读 · 0 评论 -
Android OpenGL-ES FBO(Frame Buffer Object)离屏渲染
##.FBO用途: OpenGL绘制需要一块“画布”,常见的方式是把GLSurfaceView中的Surface作为画布的载体,最终绘制好的画面会输出到GLSurfaceView对应的屏幕区域上。 如果希望绘制的画面不显示出来,默默地在后台作画,那就需要换一张“画布”,不要把画面最终输出到屏幕上。 一般是通过FBO方式来实现这一功能。(当然,如果仅仅是希望不显示到屏幕上,那么只要“画布”上的画面最终不被SurfaceFlinger消耗就行了,也并非一定要用FBO)...原创 2022-05-10 16:46:17 · 947 阅读 · 0 评论 -
Android中为线程EGL环境创建及代码示例
#.EGL介绍: OpenGl是一套跨平台的接口,它与各个平台本地窗口系统之间的交互,是借助于一个中间控制层,这个中间控制层就是EGL。EGL也有自己的一套标准API,由各个平台的系统来完成其具体实现。 EGL是OpenGL和本地窗口体系进行联系的桥梁,负责管理OpenGL的运行状态、渲染图像到本地窗口或缓冲区等功能。 在Android中,OpenGL的每一步处理,都需要依赖于EGL提供的这些相关功能支持,所以必须先创建EGL环境,才能正常进行OpenGL处理...原创 2022-05-10 15:54:53 · 1188 阅读 · 0 评论 -
Android OpenGL ES纹理总结、纹理坐标系说明、使用代码示例
#.纹理介绍: 可以简单想象成一张皮,可以贴在OpenGL空间中自己指定的区域之上,从而实现需要的视觉效果。##.使用纹理的好处: 如果想让图形看起来更真实,就必须有足够多的顶点,还要设置相应的颜色属性,会产生很多性能开销。 而如果是使用在指定的位置贴上一层纹理的方式,不需要非常多顶点,只需要纹理绘制满足需要,OpenGl中顶点位置与纹理对应位置关联正确。就可以达到需要的细节显示效果。##."需要蒙皮"位置与纹理的对应关系 纹理有自己内部的坐标系,纹...原创 2022-05-10 15:27:52 · 3060 阅读 · 0 评论 -
Android OpenGl ES使用原理总结与代码示例
一、相关概念简介:OpenGl : OpenGl是一个定义好的跨平台图形处理接口库,通过它可操作GPU来完成图像处理。它跨平台是因为各个硬件厂家都按照这套接口规范具体实现了对应功能,供上层调用。OpenGl ES: 手机由于性能相对较弱,难以支持OpenGl的全部功能,所以Android中使用的是OpenGl的子集OpenGl ES。EGL: OpenGl是一套跨平台的接口,它与各个平台本地窗口系统之间的交互,是借助于一个中间控制层,这个中间控制层...原创 2022-05-10 15:07:29 · 1344 阅读 · 0 评论 -
Android GlSurfaceView总结及代码示例讲解
##.GlSurfaceView简介:GlSurfaceView继承自SurfaceView,额外提供了一些能力: 1.支持用OpenGl对图像渲染后显示到Surface上, 2.提供了渲染器类Render,渲染器中有Surface的生命周期回调接口,以及每一帧图像的渲染接口。 3.提供了单独的GlThrad线程,设置渲染器后,该线程会启动,初始化EGL环境,并在线程中根据状态变化做Render中各个API接口的回调。...原创 2022-05-10 00:56:30 · 4606 阅读 · 0 评论 -
Android SurfaceView总结及代码示例
#一.概述 SurfaceView与普通View不同,View树上的普通View共享一个Surface,而SurfaceView拥有单独的Surface。 而且普通View必须在UI线程中绘制,而SurfaceView可以在非UI线程中完成绘制工作,不占用UI主线程。 SurfaceView可以通过SurfaceHolder获取其Surface的尺寸和状态变化,并通过SurfaceHolder控制在Surface上的控制流程。 从Android 1.0...原创 2022-05-09 23:23:59 · 1453 阅读 · 0 评论 -
Android Surface & Canvas简介
#.Surface 是图形缓冲区(GraphicBuffer)的封装类,一般用作图像绘制的载体,例如用于承载View画面、承载SurfaceView画面、承载相机拍摄的图像、或者承载MediaCodec的输入/输出画面、承载ImageReader输入缓存画面等等。 Surface都是双缓冲的,从概念上讲,可以简化理解为有两个缓冲区引用,一个frontBuffer和一个backBuffer,backBuffer指向后置缓冲区,用于缓存正在绘制的画面;而frontBuffer指向前置...原创 2022-05-08 18:30:26 · 1319 阅读 · 0 评论