android视频播放总结

[Android] Android 视频播放总结

1
VideoView

VideoView 的使用非常简单,播放视频的步骤:

  1. 在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件
  2. 调用VideoView的如下两个方法来加载指定的视频:
  • setVideoPath(String path);加载path文件代表的视频
  • setVideoURL(Uri uri);加载uri所对应的视频
  1. 调用VideoView的start()、stop()、psuse()方法控制视频的播放
    Exoplayer
    ExoPlayer Git 地址

用法
ExoPlayer开源项目包含了libray和示例:

  • ExoPlayer library - 这部分是核心的库
  • Demo app - 这部分是演示怎么使用ExoPlayer
    ExoPlayer库的核心类是ExoPlayer类。该类维护了播放器的全局状态。比如如何获取媒体数据,如何缓冲以及是怎样编码格式。

    ExoPlayer基于MediaCodec和AudioTrack提供了默认的音视频的TrackRenderer实现。所有的renderers都需要SampleSource对象,Exoplayer从SampleSource获得media samples用于播放。下图展示了Exoplayer是如何配置组合这些组件用于播放音视频的。
    此处输入图片的描述
    ExoPlayer库提供了一些不同类型的SampleSource实例:

    • ExtractorSampleSource – 用于 MP3,M4A,WebM,MPEG-TS 和 AAC;
    • ChunkSampleSource – 用于 DASH 和平滑流的播放;
    • HlsSampleSource – 用于 HLS 播放;

在 ExoPlayer 的 Dome 中使用 DemoPlayer 对 ExoPlayer 进行了封装,并提供了使用上述几种 SampleSource 构建 TrackRenderer 的 Builder。

  • SmoothStreamingRendererBuilder
  • DashRendererBuilder
  • ExtractorRendererBuilder
    在使用的时候我们根据不同的需求创建对应的 RendererBuilder,然后将 RendererBuilder 传递给 DemoPlayer 然后调用 DemoPlayer 的 setPlayWhenReady 方法。

优缺点

ExoPlayer 相较于 MediaPlayer 有很多很多的优点:

  • 支持动态的自适应流 HTTP (DASH) 和 平滑流,任何目前 MediaPlayer
  • 支持的视频格式(同时它还支持 HTTP
  • 直播(HLS),MP4,MP3,WebM,M4A,MPEG-TS 和 AAC)。 支持高级的 HLS 特性,例如正确处理EXT-X-DISCONTINUITY 标签;
  • 支持自定义和扩治你的使用场景。ExoPlayer 专门为此设计;
  • 便于随着 App的升级而升级。因为 ExoPlayer是一个包含在你的应用中的库,对于你使用哪个版本有完全的控制权,并且你可以简单的跟随应用的升级而升级;
  • 更少的适配性问题。

ExoPlayer 的缺点:

  • ExoPlayer 的音频和视频组件依赖 Android 的 MediaCodec 接口,该接口发布于 Android4.1(API 等级
    16)。因此它不能工作于之前的Android 版本。

Vitamio

Vitamio demo 地址

用法
Vitamio的使用步骤:

  1. 下载Vitamio库,并作为工程依赖。
  2. 在Activity的onCreate方法中添加如下代码,初始化Vitamio的解码器
    1
    2
    3
    4
    5
    @Override public void onCreate(Bundle icicle){
    super.onCreate(icicle)
    if(!LibsChecker.checkVitamioLibs(this))
    return ;
    }
  1. 在AndroidMainfest.xml中声明InitActivity
1
2
3
<activity android:name="io.vov.vitamio.activity.InitActivity" android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden"
android:launchMode="singleTop" android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden"/>
  1. 其余步骤和使用 Android 原生的 VideoView 是一样的。

优点

  • 强大、支持超多格式视频和网络视频播放
  • 使用简单。调用非常简单,方便使用。

ijkplayer 【哔哔哩开源】
ijkplayer 项目地址

用法
1.clone ijkplayer 项目到本地

2.编译 ijkplayer

下面是我的编译环境

配置 NDK

1
2
3
4
5
6
7
# add these lines to your ~/.bash_profile or ~/.profile
# export ANDROID_SDK=<your sdk path>
# export ANDROID_NDK=<your ndk path>

clone 项目

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android

编译 ffmpeg

1
2
3
4
5
6
7
8
cd ijkplayer-android 
./init-android.sh
cd config
rm module.sh
ln -s module-default.sh module.sh
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

ffmpeg 编译通过后,编译 ijkplayer

cd ..
./compile-ijk.sh all

编译通过后在 android 目录下有 ijkplayer 文件夹,这个是 ijkplayer 的 demo。导入 Android Studio 即可。ijkplayer 的 demo 中提供了 IjkVideoView 类,它封装了 Android 原生的 MediaPlayer 、ExoPlayer 和 IjkMediaPlayer。可根据需要选择。

优缺点

  • ijkplayer 最大的优点就是可以根据需要编译需要的解码器。在编译的时候通过 ln -s module-default.shmodule.sh 选择要编译的解码器。ijkplayer 在 config目录下提供了三种 module.sh 。也可自己修改module.sh 。
  • ijkplayer 的缺点是库太大。加入项目后会大大增加你的 APP 的大小。

Android开发职位分类

Android开发职位分类

Android开发分三类:

  1. 驱动开发:需要熟悉Linux和C语言,了解嵌入式开发相关知识,最好有驱动开发经验;待遇普遍比后两类高。
  2. Android系统开发:基于Android系统的源码进行修改,修复bug或者对系统进行深度定制,重新设计并实现用户交互,主要是修改Android java层框架和Android系统自带的应用。需要应聘者熟练掌握JAVA语言,有移动开发经验或者J2ME开发经验。
  3. Android应用开发。
    前两类的工作一般是手机硬件制造商或者手机设计公司提供这些职位,如华为、中兴、魅族、联想Lephone;华为、中兴大多是做运营商定制,基本很少对系统层进行深度定制,主要是修改bug(Android系统每个版本都有大量的bug),做这一块不但积累对Android系统层的经验,而且也积累分析问题、解决问题的经验。
    Android应用开发这个职位,大部分PC软件或互联网公司已经或正在做Android平台的支持。
    对于没有JAVA经验的人,首先掌握J2SE,然后再学Android的应用开发。无论看书、看视频、上培训班最重要的都是练习。
    Android应用开发书籍推荐《Google Android开发入门与实战》、《Google Android SDK开发范例大全》这两本书。

知识体系图
知识体系图Android 知识图谱

软件码工的修炼之路

  1. 一门语言的语法,SDK的常用API,算法与数据结构;有了上面的知识,再加上一点实践,再从网上找一些笔试题做几套,基本可以过笔试这一关。
  2. 编码规范、高性能编码经验技巧;要成为一个职业化的、专业化的程序员,首先要养成良好的习惯,良好的习惯从规范化的点滴日常工作开始。
  3. 熟练掌握IDE、常用
  4. 编程设计的原则;重点掌握面向对象的原则,如单一职责原则SRP、开放-封闭原则、替换原则LSP、依赖倒置原则DIP等。这些原则对后面内容理解的深入有很大帮助。不了解这些原则而去学设计模式会有空中楼阁、头重脚轻的感觉。
  5. 重构:重构是在不改变软件功能的前提下改善代码的设计以提高可维护性。修改代码或者优化代码都需要用到重构技术。
  6. 设计模式:基于一些常用的模式来学习如何使用设计模式。设计模式对于做框架开发的程序员比较有帮助。
  7. 代码重构的艺术:最重要、最难,看上去却最简单的功夫。修改别人的代码开始是功夫,优化就是艺术。
  8. 架构设计:这是步入殿堂必不可少的部分。
  9. 软件工程:从CMM到敏捷的转变,个人是比较推崇敏捷开发的。
  10. 质量管理:越往后越偏向管理了,开始是个人修炼,后面是站在组织、站在公司的角度来看软件。质量管理中有很多很好的理论和工具,不只可以应用到软件开发上,生活中也很有用的。

Git分支管理策略

Git分支管理策略 https://learngitbranching.js.org/?demo
1.主要分支:master

说明:代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支开发。

2.开发分支:Develop

说明:主分支只用来分布重大版本,日常开发应该在另一个分支完成。我们把开发用的分支,叫做Develop

命令:

1.开启分支:git checkout -b  develop master
2.将develop分支发布到Master分支命令:#切换到Master分支 git checkout master 
#对Develop分支进行合并 git merge --no-ff develop -m"合并分支信息"

3.临时分支:Feature/Release/Fixbug

1.Feature 功能分支:主要开发特定某功能,从Develop分支上面分出来。开发完成后,要再并入Develop。 
命名格式采用 feature-* 创建一个临时分支 git checkout -b feature-x develop 
开发完成后,将功能分支合并到develop分支。 

1.git checkout develop  
2.git merge --no-ff feature-x -m"合并分支信息" 
3.git branch -d feature-x

2.Felease 预发分支:是指发布正式版之前(即合并到Master分支之前),我们可能需要一个预发布的版本进行测试。
从Develop分支上面分出来。
开发完成后,要再并入Develop和Master。
命名格式采用 release-* 创建预发分支 git checkout -b release-1.2 develop 开发确认没问题后。 
1.git checkout master 
2.git merge --on-ff release-1.2 -m"合并分支信息" 
#对合并的生成的新节点,做一个标签 git tag -a 1.2  
#再合并到develop分支: 

1.git checkout develop  
2.git merge --no-ff release-1.2 -m"合并分支信息" 
3.git branch -d release-1.2

3.Fixbug  bug分支:软件正式发布后,难免会出现bug,就需要创建一个分支,进行bug修补。
从Master分支上面分出来的。修补结束以后,在合并到Master和Develop分支。
命名格式fixbug-*  创建bug分支 git checkout -b fixbug-0.1 master 修复结束后 合并到master分支 
1.git checkout master 
2.git merge  --no-ff fixbug-0.1 -m"合并分支信息"  
3.git tag -a 0.1.1 

#再合并到develop分支 
1.git checkout develop 
2.git merge --no-ff fixbug-0.1 -m"合并分支信息" 
3.git branch -d fixbug-0.1    

gradle包含库出现的问题

Error:org.gradle.api.internal.changedetection.state.DefaultFileCollectionSnapshotter$FileCollectionSnapshotImpl cannot be cast to org.gradle.api.internal.changedetection.state.OutputFilesCollectionSnapshotter$OutputFilesSnapshot
Possible causes for this unexpected error include:

In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

我直接把根目录的build删除,.gradle个文件夹也删除,然后gradle文件夹里面的版本再次提升一下版本就好了

Vuforia知识

Vuforia示例应用提供了九种应用展示,介绍主要特点和表现出基本功能

Image Targets (图像目标)

图像目标示例显示如何检测图像的目标和渲染在它上面的一个简单的3D对象。主要功能包括:

  1. 同时检测和多目标跟踪
  2. 加载和激活多个设备中的数据
  3. 激活扩展跟踪器
  4. 管理相机功能:闪灯光和连续自动对焦

Cylinder Targets(圆柱跟踪)
筒形靶样品显示了如何检测的圆筒形靶和围绕圆柱体的圆周运动3D对象。主要功能包括:

  1. 检测气缸目标和跟踪
  2. 遮挡处理
  3. 激活扩展跟踪
  4. 管理相机功能:闪灯光和连续自动对焦

Multi Targets(多目标)
多目标的示例显示了如何检测一个简单的长方体形状的三维动画和周边形状的3D对象。主要功能包括:

  1. 检测与长方体形状的3D跟踪
  2. 遮挡处理
  3. 激活扩展跟踪
  4. 管理相机功能:山灯光和连续自动对焦

User Defined Targets(用户自定义目标)
用户定义的目标示例显示了如何捕获和从用户选择的摄像机的视频帧运行时创建一个图像的目标。包括主要功能:

  1. 创建和管理用户的定义的图像目标
  2. 激活扩展跟踪
  3. 管理相机功能:闪灯光和连续自动对焦

Smart Terrain(智能地形)
智能地形示例应用程序演示了如何在一个目标让聪明的地形和使用重建网格渲染的内容。主要包括功能:

  1. 从已知的目标初始化
  2. 扫描表面找对象
  3. 在主要绘制网格
  4. 上主表面中找到的对象的渲染的箱

Cloud Recognition(云识别)
云Reco的示例显示了如何使用云识别服务识别位于云数据库的目标。 主要功能包括:

  1. 管理检测基于云的图像目标跟踪
  2. 激活扩展跟踪
  3. 管理相机功能:闪光灯和连续自动对焦

Text Recognition (文字识别)
文本识别样本显示在相机画面的指定区域内的动态识别英语单词。 主要功能包括

  1. 检测的英语单词和跟踪包含在默认的文字列表
  2. 管理相机功能:闪光灯

Frame Markers(帧标记)
帧标记示例演示如何检测帧标记,并呈现在上面一个简单的3D对象。 主要功能包括:

  1. 检测和多帧标记追踪
  2. 管理相机功能:闪光灯和连续自动对焦

Virtual Button(虚拟按键)
虚弥按钮示例显示了如何开发人员可以在触发时间触及或闭塞得摄像机视图时,图像的目标定义的矩形区域。样品呈现,当虚拟按钮中的一个被触发改变的颜色的3D对象。主要功能包括:

  1. 按钮遮挡事件处理
  2. 多个虚拟按钮激活
  3. 管理相机功能:闪光灯和连续自动对焦