![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
播放器
文章平均质量分 91
蓝狮
微信公众号:Android音视频分享
展开
-
H264系列--码流组成和分层结构
Android FFmpeg专题结构H264码流结构无论是解析视频文件或这通过网络传输, 其实都是一串字节序列. H264码流就是按照一定的规则组织排列的字节串.直观理解的角度按照从大到小分为: 视频序列, 图像帧, 片,宏块,子块码流功能的角度从码流功能的角度可以分为两层:NAL层和VCL层NAL网络提取层:负责以网络所要求的恰当的方式对数据进行打包和传送VCL视频编码层:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码码流解析的角度可以原创 2021-03-10 17:11:26 · 682 阅读 · 0 评论 -
H264系列--压缩编码技术
Android FFmpeg专题结构概述H264 无疑是目前应用最广泛的编码技术。一些比较优秀的开源库x264/openh264, ffmpeg等让人们处理h264编解码变得相对容易。为了能更好地理解和处理h264问题,还是有必要了解相关的原理H264压缩技术主要采用了以下几种方法对视频数据进行压缩:帧内预测压缩,解决的是空域数据冗余问题。帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。CABAC熵编码,原创 2021-03-04 10:09:43 · 614 阅读 · 1 评论 -
H264系列--简单的视频编码历史介绍
什么是视频编码所谓视频编码方式就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式常见视频编码格式编码格式有很多,如下图:目前比较常用的编码有H26x系列 : 由ITU(国际电传视讯联盟)主导,侧重网络传输MPEG系列:由ISO(国际标准组织机构)下属的MPEG(运动图象专家组)开发PV8/PV9:VP8是类似于 H.264 的另一种视频编码,由 On2 公司开发。后来 Google 收购了 On2. 主要应用在webrtc中,音视频通话一般都是基于webrtc实现的原创 2021-01-22 16:09:52 · 931 阅读 · 2 评论 -
H264系列--压缩编码必要性和冗余
Android FFmpeg专题结构视频编码必要性视频是由一帧帧的图片组成. 以一个时长 1小时,帧率为30fps, 分辨率为1080P的视频举例, 一帧未压缩的图片(yuv420)大小为1920∗1080+1920∗1080/4+1920∗1080/4=3110400byte1920 * 1080 + 1920 * 1080 / 4 + 1920 * 1080 / 4 =3110400 byte1920∗1080+1920∗1080/4+1920∗1080/4=3110400byte视频总大小原创 2020-12-25 11:03:49 · 1145 阅读 · 0 评论 -
视频编码历史简单介绍
视频编码格式非常多,可谓百家争鸣。这个武林中,有两大门派 少林(ITU-T国际电信联盟)和武当(ISO 国际标准化组织)两大门派都有很强的实力,都试图一统武林,各自研发出来几大绝学少林(ITU-T)开发了H261,H262,H263等编码格式武当派(ISO)开发了mpeg1, mpeg2, mpeg4等编码格式经过10几年的比武斗争,两派决定联手组成同盟两派联合推出了 H.264 和H.265H.264 H.265是ITU-T的命名, AVC, HEVC是ISO的命名,两个其实是一样。原创 2020-11-29 20:04:34 · 195 阅读 · 0 评论 -
播放器基础--颜色空间
颜色空间也称彩色模型(又称彩色空间或彩色系统)它的用途是在某些标准下用通常可接受的方式对彩色加以说明。对于播放器应用来说,可以理解为图片的颜色空间就是视频最终显示的数据,即解码后的原始数据颜色空间有许多种,常用有RGB,CMY,HSV,HSI, YUV等。播放器比较常接触到的就是RGB和YUV,经常是将视频解码成YUV格式的数据,再转换成RGB交给Android显示设备显示RGB颜色空间RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为原创 2020-09-15 17:27:50 · 499 阅读 · 0 评论 -
MediaPlayer(二)--MediaPlayer基本框架
MediaPlayer涉及的的文件路径这里参考的是android8.1 的代码JAVA类的路径:frameworks/base/media/java/android/media/MediaPlayer.javaJNI路径:frameworks/base/media/jni/android_media_MediaPlayer.cpp编译为 libmedia_jni.sonative 层的接口frameworks/av/media/libmedia编译为 libmedia.sonative层原创 2020-09-15 16:49:48 · 613 阅读 · 1 评论 -
FFmpeg--简介
Android FFmpeg专题结构FFmpeg 是基于GNU General Public License 协议的开源多媒体软件项目。 FF意思是 Fast Forward - 播放器上的快进按钮, mpeg 是 Moving Pictures Experts Group的简称。FFmpeg 命令行工具ffmpeg快速音视频编解码ffplay播放器ffprob检测媒体文件的特性ffserver使用HTTP和RTSP协议的流媒体服务器FFmpe原创 2020-09-15 15:56:44 · 367 阅读 · 1 评论 -
Android基础--利用ANativeWindow显示视频
Android FFmpeg专题结构利用Android 写视频显示应用时,经常会用到SurfaceView等控件来显示视频。在前面的文章Android基础–SurfaceView, Surface, SurfaceHolder中,也简单得提了一下SurfaceView和Surface的关系:SurfaceView提供了一个专门用于绘制的surface。java层实际上是利用SurfaceView将视频数据渲染到Surface上。而Native层要渲染视频可以通过ANativeWindow来渲染。Su原创 2020-09-11 17:18:20 · 1652 阅读 · 0 评论 -
Android FFmpeg专题结构
由于在工作中碰到一个需求,需要在播放视频的过程中根据外部情况对视频画面进行旋转,Android 原生的MediaPlayer不具备该功能,所以采用ffmpeg来实现。在工作中由于时间关系,写得比较匆忙,想对代码进行整理和完善,自己也一直想能写点东西.所以有了写一个关于ffmpeg专题的想法, 同时对播放器进行完善, 使自己实现的播放器能和MediaPlayer简单切换。专题分为5个部分:播放器基础知识Android基础知识,主要是Android MediaPlayer会涉及到的一些知识原创 2020-07-22 16:31:11 · 150 阅读 · 0 评论 -
JNI回调Java
jclass、jobject、jmethodID 和 jfieldIDjni回调java是通过反射来实现的,这些反射的接口都定义在 JNIEnv中。jclassjava类引用可以通过FindClass来获取const char* className = "pri/tool/ffmediaplayer/MediaPlayer";jclass clazz;clazz = env->FindClass(className);另一种获取方法是已经知道对象/实例的引用,通过GetObject原创 2020-07-22 16:26:54 · 708 阅读 · 0 评论 -
ffmpeg -- 时间基准
AV_TIME_BASEffmpeg中的内部计时单位(时间基),ffmepg中的所有时间都是于它为一个单位,AV_TIME_BASE定义为:#define AV_TIME_BASE 1000000其实是一种分数的表示形式,其中的1表示分子, AV_TIME_BASE 也就是1000000,表示的是分母,所以它其实就是1微秒,也就是 1/1000000 秒。比如一段时长为60s的视频,读出来 duration为60000000,即 duration/AV_TIME_BASE =原创 2020-06-24 16:04:38 · 518 阅读 · 0 评论 -
搭建ffmpeg player -- 整体思想介绍
project 采用 Android MediaPlayer生命周期 + Gstreamer pipeline的思想框架来构建.采用Android MediaPlayer生命周期的原因方便上层应用在Android MediaPlayer和project间进行切换, 至于为什么要切换有几方面的考虑:本人能力有限,做出来的东西比不上Android MediaPlayer大部分应用是基于MediaPlayer, 如果有需求MediaPlayer无法实现而本project提供了实现的方法,能够方便地切原创 2020-06-24 14:48:53 · 240 阅读 · 0 评论 -
播放器基础--OpenSL ES音频播放
介绍官网OpenSL ES (Open Sound Library for Embedded Systems)是针对嵌入式系统的一套无授权费,跨平台, 硬件加速的音频API。它提供了一套标准化,高性能,低延时的方法, 本地应用(C/C++)的开发者可以通过这套方对音频进行操作, 实现软/硬件音频性能的直接跨平台部署,降低执行难度,促进高级音频市场的发展NDK 软件包中包括 Khronos Group 开发的 OpenSL ES™ 1.0.1 API 规范的 An原创 2020-06-20 16:14:30 · 1450 阅读 · 0 评论 -
MediaPlayer--stop()流程
frameworks/base/media/java/android/media/MediaPlayer.java /** * Stops playback after playback has been started or paused. * * @throws IllegalStateException if the internal player engine has not been * initialized. */ public原创 2020-06-17 15:17:01 · 770 阅读 · 0 评论 -
播放器基础--YUV色彩模型
做过camera, 播放器,图片处理的对YUV都不会陌生,但是关于YUV有很多的格式YUV420, NV21, YUV420sp, YV12等等往往令人混乱介绍YUV色彩模型利用人类视觉对亮度的敏感度比对色度的敏感度高的特点获得较RGB色彩模型的优势.Y为亮度信息,UV为色差(Chroma)信息。U/V分别等于blue–luminance/red–luminance. Y信号分量为黑白灰度图。U、V信号分量为单色彩色图。如果只需获取灰度图,只要获取Y分量就好了.YUV主要用于优化彩色视频信号的传输,原创 2020-06-05 16:19:36 · 1518 阅读 · 0 评论 -
播放器基础--组成模块
一个播放器无论结构逻辑多么复杂, 都可以分成以下几部分: src, demux,decode, sinksrc 是指媒体数据输入源, 可以是磁盘上的文件或网络流等demux 是指解封装. 媒体文件和网络流是将音视频压缩编码后和其他数据一起打包传输的. 解封装即为上述的逆过程,将音视频流都分离处理.decode 是指解码. 原始的音视频数据是很大的,无论是网络传输还是作为文件保存起来,都需要对音视频raw data进行编码.解码是还原出原始数据,用于最后的显示播放sink 指音视频数据的终点. 比原创 2020-06-05 10:27:30 · 821 阅读 · 0 评论 -
播放器基础 -- 名词介绍
常见名词1 封装格式我们经常见到的mp4, avi,mkv等后缀的媒体文件,指的是文件的封装格式。是将已经编码压缩好的视频,音频,字幕等按照照一定的格式放到一个文件2 编码格式未经压缩的音视频原始数据是很大的,编码的目的即压缩数据量。比较常见的编码格式有MPEG(MPEG-2, MPEG-4)H.26X(H.263, H.264/AVC, H.264/HEVC)3 帧率 (frame rate)是以帧称为单位的位图图像连续出现在显示器上的频率。fps(frames per second)是原创 2020-06-04 15:42:15 · 346 阅读 · 0 评论 -
MediaPlayer(四)--MediaPlayer()流程
基于Android8.1代码#java MediaPlayer()先从源头开始看frameworks/base/media/java/android/media/MediaPlayer.java public MediaPlayer() { super(new AudioAttributes.Builder().build(), Aud...原创 2020-04-24 16:57:31 · 415 阅读 · 0 评论 -
搭建ffmpeg player(一)--搭建上层框架
工程地址https://github.com/yizhongliu/FFMediaPlayerbase commit:78cb1de4fa5f0b378d1fb2f533945638016a9388工程结构在前面的文章MediaPlayer–MediaPlayer基本框架 和 MediaPlayer–Android MediaPlayer的使用方法,了解了搭建mediaplayer的基本信...原创 2020-04-24 10:12:16 · 856 阅读 · 0 评论 -
MediaPlayer(总结)--从对象生命周期理解MediaPlayer状态
为了方便先重复贴一下MediaPlayer的状态图和MediaPlayer 的基本框架总的分为几个模块,为方便后续文章的书写,各模块后续统一用括号里面的名词java层MediaPlayer(MediaPlayer)jni层(jni)mediaplayer client端(mediaplayer)MediaPlayer service端 (MediaPlayerService)na...原创 2020-04-20 17:07:17 · 555 阅读 · 0 评论 -
MediaPlayer(十)--release()流程
release相比reset流程,多了一些处理MediaPlayer层将MediaPlayer的各种listener置为nulljni层减少了对surface的引用jni层销毁了mediaplayer的实例这里先偷懒,没详细分析 /** * Releases resources associated with this MediaPlayer object. ...原创 2020-04-20 16:22:53 · 947 阅读 · 0 评论 -
MediaPlayer(九)--reset()流程
frameworks/base/media/java/android/media/MediaPlayer.java /** * Resets the MediaPlayer to its uninitialized state. After calling * this method, you will have to initialize it again by se...原创 2020-04-20 16:11:08 · 2054 阅读 · 0 评论 -
MediaPlayer(八)--start()流程
frameworks/base/media/java/android/media/MediaPlayer.java /** * Starts or resumes playback. If playback had previously been paused, * playback will continue from where it was paused. If ...原创 2020-04-18 15:46:38 · 1518 阅读 · 0 评论 -
MediaPlayer(七)--prepareAsync
frameworks/base/media/java/android/media/MediaPlayer.java /** * Prepares the player for playback, asynchronously. * * After setting the datasource and the display surface, you need ...原创 2020-04-18 14:58:28 · 1145 阅读 · 0 评论 -
Android基础--SurfaceView, Surface, SurfaceHolder
SurfaceView, Surface, SurfaceHolderSurfaceHandle onto a raw buffer that is being managed by the screen compositor。即Surface是保存原始缓存区的句柄,也就是显示的像素数据SurfaceViewSurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘...原创 2020-04-14 10:27:03 · 290 阅读 · 0 评论 -
MeidaPlayer(六)--setDisplay流程
在Activity 的OnSurfaceCreate回调后,表示Surface已经创建成功,可以将surface传到native层playerframeworks/base/media/java/android/media/MediaPlayer.java public void setDisplay(SurfaceHolder sh) { mSurfaceHolder ...原创 2020-04-13 10:36:23 · 1805 阅读 · 0 评论 -
Android基础--智能指针
智能指针分为3类为轻量级指针(Light Pointer)、强指针(Strong Pointer)和弱指针(Weak Pointer)。轻量级指针采用的是简单的计数,可以认为是强指针的简化版本。在播放器的C++代码中,特别是涉及到binder通讯的地方有很多智能指针的应用,比如jni中sp<MediaPlayer> mp = getMediaPlayer(env, thiz);s...原创 2020-04-08 17:04:14 · 402 阅读 · 0 评论