以前做过一些视频播放器相关的功能,当时从零开始学习,后来项目结束就放下了,时间一长都忘了,整理一下备忘吧。

生命周期

Android 平台自带了播放器 Mediaplayer,使用比较方便,只需要了解下它的生命周期,就能应对些基本的功能了。
(时间太长,忘了当时从哪学的了,只留下这张图片)

注意几点:

  1. 如果运行过程中,出现了IllegalStateException异常,那就说明调用某个方法的时候状态不对,需要检查流程。
  2. 通过reset()进入 Idle state 后,如果调用错误的方法,会触发 Error state。而如果是刚 new完,就不会触发。
  3. 如果调用release进入End state了,就真end了,想再使用只能重新new。
  4. 注意prepare 和 prepareAsync 的区别,异步的需要等待 callback。
  5. 进入 Error state 后,只能通过 reset 来重置为 Idle state。
  6. Looping 代表是否循环播放。

容器与压缩标准

平常所见的那种.rm .rmvb .mkv .avi 视频文件都是多媒体容器文件格式。
所谓容器就是将不同的多媒体数据流(多条音频流,字幕流和视频流)联合起来加到一个文件(载体)里面,多媒体容器 (Multimedia Container)也称为多媒体封装格式,它只是为多媒体编码提供了一个“外壳”。
与之不同的是H.264、H.265、DivX、 MP3这类叫做编码格式,也称为压缩标准。

多媒体容器文件格式
文件头部分(压缩标准,规范信息)
索引部分
多媒体数据部分

文件头部分 说明了多媒体数据符合的压缩标准及规范信息,常见的多媒体数据的压缩标准有:MPEG系列,H.26x系列;多媒体数据符合的规范信息可以包括视频的分辨率、帧率,音频采样率等。
索引部分 多媒体数据通常被分成若干块不连续存储,需要建立存储位置索引
多媒体数据部分 就是经过压缩的多媒体数据,包括视频数据、音频数据、文本数据等。

ijkplayer

之前实现功能用的框架就是ijkplayer,感谢小破站的开源。
这里放一张图,当时在网上搜的,基本说明了播放视频的完整流程,很有用:

要在工程里使用 ijkplayer 的话,可以直接在 gradle 里引用 dependencies;也可以自己下载源码编译。推荐自己编译吧,可以在编译的时候裁剪一些功能,选择注重轻量级或者兼容性。

集成之后的使用比较简单,下面放上一段示例代码:

    private void initPlayer(){mediaPlayer = new IjkMediaPlayer();try {if (videoPath != null){mediaPlayer.setDataSource(videoPath);}else if (videoURI != null){mediaPlayer.setDataSource(this,videoURI);}else{return;}} catch (IOException e) {e.printStackTrace();return;}IjkMediaPlayer ijkMediaPlayer = (IjkMediaPlayer)mediaPlayer;ijkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_WARN);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", Setting.getInstance().getDecodeType());ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 0);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 0);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV16);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);mediaPlayer.setDisplay(surfaceView.getHolder());mediaPlayer.setOnPreparedListener(listener);mediaPlayer.setOnBufferingUpdateListener(listener);mediaPlayer.setOnCompletionListener(listener);mediaPlayer.setOnErrorListener(listener);mediaPlayer.setOnInfoListener(listener);mediaPlayer.setOnSeekCompleteListener(listener);mediaPlayer.prepareAsync();}

完整的演示程序可以访问:https://gitee.com/aslgd/Pplay

Ffmpeg结构体

ijkplayer 也是基于 ffmpeg,这里是一些关键的结构体:
a) 解协议(http,rtsp,rtmp,mms)
AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)
b) 解封装(flv,avi,rmvb,mp4)
AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。
c) 解码(h264,mpeg2,aac,mp3)
每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。
d) 存数据
视频的话,每个结构一般是存一帧;音频可能有好几帧
解码前数据:AVPacket
解码后数据:AVFrame

关于视频播放的一些总结相关推荐

  1. python开发视频播放器_python视频播放器

    广告关闭 100GB直播流量包仅需9.9元,10TB点播流量包仅需999元,参与活动还赠移动直播SDK,短视频SDK,小程序插件等,大促100%中奖率 最近研究了python的两个gui包,tkint ...

  2. h5 video视频播放的同时加水印,图片加水印同样的原理

    经常能看到播放视频的网站上加水印的效果,记录下成果以备后续看: 效果图如下: h5页面视频播放的同时加水印,有以下3种方法可尝试: 在原视频上添加,由于每次登陆的用户不一样,需要根据用户名动态确定水印 ...

  3. OpenCV播放视频-----滚动条随着视频播放移动代码

    学习OpenCV,使用highGUI工具包实现视频的播放控制,使滚动条随着视频播放移动 代码如下: #include "highgui.h" #include "dire ...

  4. 使用html5进行视频播放

    一直以来网页大多是使用 flash 来播放视频.在目前唱衰 flash 的环境下,HTML5 为我们带来了一个网页内视频播放的解决方案-- <video>标签. 在HTML5 中,可以通过 ...

  5. 监听UIWebView点击视频播放的事件

    最近项目需要统计在跳转UIWebView后,用户点击网页上的视频进行播放的概率.找了很多监听进入视频播放的方法,最后在stackoverflow找到下面这个使用Notification的可行方法(如果 ...

  6. Qt实用技巧:使用OpenCV库的视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等...

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 需求 使用OpenCV库的视频播放器(支持播放器操作,如暂停.恢复 ...

  7. ffmpeg php 快速播放,怎么在PHP中利用FFmpeg函数对视频播放的时长进行获取

    怎么在PHP中利用FFmpeg函数对视频播放的时长进行获取 发布时间:2020-12-18 16:02:20 来源:亿速云 阅读:96 作者:Leah 这篇文章给大家介绍怎么在PHP中利用FFmpeg ...

  8. JS进阶篇--ckplayer.js视频播放插件

    网页中常见的功能就是播放视频,下面介绍的这个ckplayer.js既可以在pc端播放,也可以在手机网页上播放. 可调用flash也可以调用html5播放器: <div id="a1&q ...

  9. java视频播放器制作_java创建简易视频播放器

    java创建简易视频播放器 发布时间:2020-09-23 04:28:09 来源:脚本之家 阅读:98 作者:南柯一梦xihe 最近有个多媒体的作业,要求使用visualC++和OpenCV编写一个 ...

  10. python 视频播放界面_PyQt转换显示Python-OpenCV图像实现图形化界面的视频播放

    一.引言 在Python-OpenCV中显示图像时调用的是一个单独的窗口,有时我们需要将这些图像显示在PyQt的图形化界面上,这样就可以将整个图像显示与PyQt图形化界面进行整合.但OpenCV格式的 ...

最新文章

  1. 初识片选信号和中断控制器
  2. leetcode算法题--Binary Tree Paths
  3. 【小白学习keras教程】十一、Keras中文本处理Text preprocessing
  4. 关于Unity中Shader的内置值
  5. php 频繁dom和 文件,性能优化之为什么不要频繁操作DOM
  6. android 拍照屏幕大小,Android Camera 找出屏幕的最佳尺寸大小
  7. [sed] linux sed 批量替换字符串-转
  8. Helm 3 完整教程(十二):Helm 函数讲解(6)字典函数
  9. Ruby之旅(16) 异常处理 rescue与ensure
  10. 推荐一下干货-------为什么你的app不耐看
  11. javascript-----日历控件
  12. 电脑用来测试网段信号的软件,WiFi信号分析仪PC版
  13. 原生js获取屏幕高度
  14. 深入了解Spring IoC
  15. html 数组动态添加元素,js如何动态添加数组?
  16. mysql 1436,Mysql Error Code : 1436 Thread stack overrun
  17. 肠道细菌产生的神经递质调节宿主的感觉行为
  18. C++[POJ1849]铲雪车问题——树形DP求出树的直径
  19. php网站微博帐号登录代码,redis+php实现微博(一)注册与登录功能详解
  20. iOS 逆向编程(十九)Mach-O 入门了解(如何通过 Mach-O 逆向 APP 思路)

热门文章

  1. Java 浦发银行2020-3-22编程题
  2. GB/T 21605化学品急性吸入毒性试验方法
  3. 51单片机波特率计算工具介绍
  4. Delphi 2010安装及使用UniDAC安装和使用
  5. 系统集成项目管理工程师历年考题
  6. 学习使用USB-TTL驱动PN532来读写IC卡
  7. FC小霸王4000余款游戏整合版图文说明
  8. 可解释的机器学习(XML)概览
  9. jmeter利用察看结果树查看响应调试取样器(Debug Sampler)(3)
  10. IOS中impactor报182错误解决方法