精华内容
下载资源
问答
  • 想了解用于多目标跟踪的比较简单视频库,自己能力有限做不了难的。最好还有用简单视频库的文献,等级低无所谓。还有就是一般对多目标跟踪怎么评价啊,与别人如何比较。希望大家能提供给我,不甚感激,望大神们指教...
  • 7个最佳WordPress视频库插件

    千次阅读 2020-06-21 08:57:07
    尽管WordPress的内置功能可以很好地处理图片库,并且可以很好地显示单个视频,但是对于普通的WordPress安装而言,拥有成熟的视频库仍然是遥不可及的。 幸运的是,这里有大量有用的插件,可帮助您获得所需的视频库...

    试图将一组视频放到您的WordPress网站上? 尽管WordPress的内置功能可以很好地处理图片库,并且可以很好地显示单个视频,但是对于普通的WordPress安装而言,拥有成熟的视频库仍然是遥不可及的。

    幸运的是,这里有大量有用的插件,可帮助您获得所需的视频库,同时让您控制它们的外观。 但是首先,让我们找出您想要的WordPress视频库插件。

    您在WordPress视频库中寻找什么?

    有很多适用于WordPress的视频库插件,但是找到适合您特定需求的视频库插件可能需要进行一些研究。 在查看我们的主要竞争者之前,重要的是要知道您要寻找的是什么。

    以下是一些要开始的问题:

    • 您需要哪种布局? 标准网格可以解决问题吗?还是您要寻找砌体风格的显示器?
    • 您需要支持哪些视频源? 您所有的视频都托管在YouTube上吗? 还是需要将诸如Vimeo,Wistia或自托管视频之类的资源组合在一起?
    • 您是否希望能够在图库中将媒体混合在一起? 您要并排显示视频,图像或其他文件类型吗?
    • 您是在寻找现成的解决方案,还是可定制性对您很重要?

    在没有首先回答这些问题的情况下,您可能会陷入安装和卸载大量插件的陷阱中,然后才最终找到适合您需求的插件。 提前回答这些问题可以使选择最佳解决方案变得更加容易。

    让我们看一下市场上一些最好的WordPress视频库插件。

    1.基本网格图库

    我们的第一个示例是Essential Grid Gallery WordPress插件 这个混合的网格画廊解决方案已经存在了几年,定期进行更新,包括最近对WordPress Gutenberg进行的优化。

    Essential Grid Gallery WordPress插件
    运行中的基本网格库

    基本网格库兼容性

    此插件的主要方面之一是,在兼容性方面,其开发团队如何进行全面的测试。 开箱即用,它可与所有现代Web浏览器一起使用,甚至还支持Internet Explorer9。Essential Grid的兼容性也不会因浏览器而停止。 还对它进行了优化,以与各种网站构建器一起使用,包括Elementor,WPBakery(以前是Visual Composer)和Beaver Builder。

    轻松调整外观

    使用此插件,您可以从一种预构建的外观中进行选择,从而快速创建美观的图库。 您也可以创建自己的自定义外观,并且您的画廊和网格可在整个站点中使用它们。 您还可以使用内置的可视编辑器更改现有的。

    广泛的媒体支持

    Essential Grid Gallery不仅仅支持视频(尽管它如此出色!)。 借助其内容源选择器,您可以创建支持YouTube,Vimeo甚至自托管视频的画廊。 它的可扩展性允许同时添加其他媒体,包括图像,流行的社交媒体平台中的媒体,WordPress帖子等。

    2.合理的图像网格

    接下来,我们有Justified Image Grid:高级WordPress画廊 像此列表中的许多插件一样,“对齐图像网格”被构建为可处理多种网格和媒体布局,但在视频方面仍然表现出色。 该插件售价27美元,会定期更新,并拥有5星级评级,拥有1,600多个评论。 让我们看看它的一些功能。

    合理的Image Grid WordPress插件
    对齐图像网格中的叠加层和效果示例

    外观和布局

    顾名思义,此网格和视频库插件允许多种不同的视觉样式,包括合理对齐,使所有内容完美对齐。 还可以使用少数皮肤,并且可以对其进行彻底修改(包括与WPBakery集成的模块!)。

    Justified Image Grid也具有一些有趣的视觉功能。 例如,它提供了自动支持以提供针对视网膜设备缩放的缩略图,并且您可以动态地将各种图形效果应用于媒体。

    媒体来源和其他功能

    Justified Image Grid主要是一个网格插件,可以立即为媒体源提供很多支持。 有多种方法可以从WordPress,NextGEN Gallery,Facebook,Flickr和RSS feed中为网格引入媒体。 在视频方面,支持在YouTube,Vimeo上托管和自行托管的视频。

    除了可用的来源数量外,此插件还为表格带来了许多有用的功能。 WPML支持,对动画GIF的支持以及许多性能优化使其成为一个很好的解决方案。

    3.媒体网格:WordPress自适应组合

    我们名单上的第三个是Media Grid:WordPress响应式投资组合插件,售价为25美元。 这个网格画廊组合为您提供了多种布局供您选择,包括最受欢迎的砖石外观。 它还自动提供了多种样式,并内置了可视化编辑器,可以进一步自定义您的设计。

    Media Grid WordPress Gallery插件
    Media Grid背后的管理员

    该网格插件包含快速启动和运行视频库所需的一切,包括对YouTube,Vimeo和自托管视频的支持。 但是,与列表中的其他列表不同,该插件也将Dailymotion纳入其中。 除此之外,它还支持各种WordPress数据源,图像甚至音频源。

    4.视频库WordPress插件

    恰当地命名为Video Gallery WordPress的插件要比到目前为止我们关注的其他插件更加集中。 它专门针对视频库功能。 这个定期更新的插件售价20美元,并包含一些独特功能。

    视频库WordPress插件
    视频库示例布局

    插件中包含一些不错的外观,可帮助您入门,以及将YouTube,Vimeo,Dailymotion和自托管视频添加到图库的功能。 除了将视频手动添加到图库外,此插件还使您可以选择从“流”(例如播放列表,特定用户的频道或关键字搜索)插入视频。

    5.网格:响应式WordPress网格插件

    另一个定期更新且广受欢迎的插件Grid:响应式WordPress Grid插件可让您创建漂亮的视频库,价格为27美元。 该插件支持网格,砖石结构和合理布局,可轻松获得您想要的外观。 结合内置的可视编辑器和对Visual Composer / WPBakery的支持,您还可以对视频库的设计进行大量控制。

    网格WordPress插件
    网格的默认砖石外观之一

    如果您想在图库中添加各种社交供稿,那么Grid是您的最佳选择。 这个图库插件支持YouTube,Vimeo和自托管视频(包括每个视频的流),但除此之外,您还可以混合来自Facebook,Twitter,Flickr等的内容。

    6. Final Tiles WordPress库

    Final Tiles WordPress画廊在此列表的其余部分中有些偏离,具有一些独特的优缺点。 该插件的重点是使创建视频库尽可能容易,但是不幸的是,它具有一些缺点。

    由于缺少与现有可视页面构建器的集成,Final Tiles不能提供与其他插件一样的兼容性。 但是,其用于创建画廊的管理区域非常易于使用,并且内置各种灯箱和社交共享功能。

    7.智能电网图库

    我们列表中的最后一个视频画廊插件是Smart Grid Gallery:响应式WordPress画廊插件 ,它是一个更简单的插件。 Smart Grid带有一些样式,并且可以使用可用的颜色选择器交换颜色。 它还带有几个媒体悬停和布局选项,但是如果您想真正深入了解自定义,则需要了解一些CSS。

    Smart Grid Gallery WordPress插件

    在支持方面,智能电网将其保持在最小限度,并具有使用图像,YouTube视频或Vimeo视频的功能。 如果您正在寻找简单的解决方案,智能电网可能是您的理想选择。

    您将使用哪个视频库?

    如果您是这篇文章的作者,希望找到可以在您的站点中使用的最佳WordPress视频库插件,希望您找到了! 您是否最终使用了此列表中的任何插件? 有自己喜欢的视频库扩展程序吗? 在评论中告诉我们有关它们的信息!

    翻译自: https://code.tutsplus.com/articles/best-wordpress-video-gallery-plugins--cms-32600

    展开全文
  • mac os上编译vlc视频库的踩坑之旅

    千次阅读 2017-08-08 11:10:29
    mac os上编译vlc视频库的踩坑之旅mac os上编译vlc视频库的踩坑之旅 开始编译VLC视频库 一前期准备工作 二参照官方编译文档安装软件 三开始编译vlc 四踩一些坑 五总结新项目开始目涉及媒体播放,在android上多媒体...

    mac os上编译vlc视频库的踩坑之旅

    新项目开始目涉及媒体播放,在android上多媒体播放最简单就是官方内置的MediaPlayer,其次有ffmpeg,Vitamio,VLC等,最后采用的是:VLC

    • MediaPlayer播放支持格式较少,并且不支持流媒体
    • FFmpeg功能强大,重量级
    • Vitamio需要商业授权
    • VLC集成了部分ffmpeg的功能,支持多种格式,并且支持流媒体

    开始编译VLC视频库

    一.前期准备工作

    1.首先需要安装Homebrew它是mac上的包管理神器,后期需要用它软件一些编译用到的软件。安装方法,打开terimal,并输入ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 进行安装。完成后用brew --version 查看是否安装成功。
    2.配置一下mac环境的环境变量,cd ~ 到用户下,用vim .bash_profile 编辑环境变量参数增加以下:

    export ANDROID_SDK=/你的sdk路径/
    
    export ANDROID_NDK=/你的ndk路径/
    
    export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools

    这些参数可以在android studio下工具栏,点击project-structure里找到
    这里写图片描述

    二.参照官方编译文档安装软件

    Mac上所需的软件包
    我们可以根据它给的这个命令行
    sudo apt-get install automake ant autopoint cmake build-essential libtool \ patch pkg-config protobuf-compiler ragel subversion unzip git来安装需要的软件包

    需要
    automake
    ant
    libtool
    cmake
    protobuf

    使用brew install automake ant libtool cmake protobuf 进行安装。以下是我安装完后显示的列表(可以在terimal中使用命令brew list 查看):

    这里写图片描述
    我们暂时只关注前面表格里的几个即可(其他也需要用到后面再提)
    这里可以注意到官方编译命令行中有几个软件包我们并没有安装如git,autopoint。对于git等默认的软件这里不提及。
    注:autopoint我这里使用brew无法安装,具体原因google给出的答案是跟系统有关,希望有人能作出解答。但是我这里安装了依赖gettext,并且在gettext的安装目录bin下发现了autopoint的影子, 所以通过 Homebrew 安装 gettext 之后,修改 ~/.bash_profile:
    加入一行 export PATH=${PATH}:/usr/local/opt/gettext/bin。这样在termial下就可以直接使用autopoint命令行,所以我这里是没有直接下载autopoint。
    安装完毕后会出现以下图片,说明安装成功:
    这里写图片描述
    如果安装失败,请检查网络以及vpn,并重试。

    三.开始编译vlc

    1.下载vlc :git clone https://code.videolan.org/videolan/vlc-android.git
    此时会在打开terimal路径下生成一个vlc-android的文件夹,我们使用cd进入该文件夹
    2.开始编译

    > 可以使用sh compile.sh进行编译 //sh compile.sh -a <ABI>这个命令可以指定平台。
    如果你运气逆天的话,执行这个命令后就可以等待编译成功了,但是由于环境限制,包括网络,mac配置了什么鬼东西都可以导致你失败。成功的话可以看到以下内容:
    

    这里写图片描述
    这里我大概遇到了几十个错误,而且是google找不到的,只能一步步来解决。

    四.踩一些坑

    1.gradle的错误

    异常What went wrong: A problem occurred configuring root project 'gradle-3.4.1'. > java.io.FileNotFoundException: /Users/whyus/Desktop/vlc/vlc-android/gradle-3.4.1/lib/plugins/gradle-diagnostics-3.4.1.jar (No such file or directory)

    这个错误真坑,google,百度都解决不了,我去相应的目录下找该jar包,神奇的也发现存在,重试也不行,而且是io异常,最后我把mac重启后,这个错误消失了,谁能告诉我什么鬼吗?
    2.网络异常的错误

    error: RPC failed; curl 56 SSLRead() return error -9806iB/s    
    fatal: The remote end hung up unexpectedly
    fatal: early EOF

    这个错误是网络异常,重试即可解决,还有这个错误

    fatal: unable to access 'https://github.com/hoene/libmysofa.git/': Could not resolve host: github.com
    make: *** [../../contrib/tarballs/mysofa-git.tar.xz] Error 128
    contribs: make fetch failed

    也是同样,不过只遇到一次,也是重试解决了。
    3. Error: unknown register alias ‘GP’错误

    {standard input}:646: Error: unknown register alias 'GP'
    {standard input}:682: Error: unknown register alias 'GP'
    {standard input}:718: Error: unknown register alias 'GP'
    {standard input}:754: Error: unknown register alias 'GP'
    {standard input}:790: Error: unknown register alias 'GP'
    {standard input}:826: Error: unknown register alias 'GP'
    clang38: error: assembler command failed with exit code 1 (use -v to see invocation)
    这个错误每次重新编译忘记配置总是会出现,刚开始还误解了这个错误的意思。参考`https://stackoverflow.com/questions/42828978/unknown-register-alias-errors-when-building-vlc-for-android-on-a-mac` 给出的答案,在vlc-android/vlc/contrib/src/ffmpeg/rules.mak文件中,修改如下代码:
    
    FFMPEGCONF = \
      --cc="$(CC)" \
      --pkg-config="$(PKG_CONFIG)" \
      --disable-doc \
      --disable-asm \          //添加此行代码
      --disable-encoder=vorbis \
      --disable-decoder=opus \
      --enable-libgsm \
      --enable-libopenjpeg \
      --disable-debug \
    

    4. 软件版本错误

    Unrecognized syntax identifier "proto3". This parser only recognizes "proto2". How to update to proto3 for golang? #182

    遇到这个错误的原因是因为我是手动安装的2.6版本的protobuf,所以出现这个错误。参考https://stackoverflow.com/questions/21775151/installing-google-protocol-buffers-on-mac 使用brew install protobuf 安装protobuf,再使用brew link --force --overwrite protobuf 此时使用protoc --version 版本已经发生变化,重试问题解决。

    5. 配置异常

    Libraries have been installed in:
       /Users/whyus/Desktop/bulidvlc/vlc-android/vlc/contrib/arm-linux-androideabi/lib
    
    If you ever happen to want to link against installed libraries
    in a given directory, LIBDIR, you must either use libtool, and
    specify the full pathname of the library, or use the `-LLIBDIR'
    flag during linking and do at least one of the following:
       - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
         during execution
       - add LIBDIR to the `LD_RUN_PATH' environment variable
         during linking
       - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
       - have your system administrator run these commands:
    
    
    See any operating system documentation about shared libraries for
    more information, such as the ld(1) and ld.so(8) manual pages.
    ----------------------------------------------------------------------
    make[4]: Leaving directory `/Users/whyus/Desktop/bulidvlc/vlc-android/vlc/contrib/contrib-android-arm-linux-androideabi/gnutls/lib'
    make[3]: Leaving directory `/Users/whyus/Desktop/bulidvlc/vlc-android/vlc/contrib/contrib-android-arm-linux-androideabi/gnutls/lib'
    make[2]: Leaving directory `/Users/whyus/Desktop/bulidvlc/vlc-android/vlc/contrib/contrib-android-arm-linux-androideabi/gnutls/lib'
    make[1]: Leaving directory `/Users/whyus/Desktop/bulidvlc/vlc-android/vlc/contrib/contrib-android-arm-linux-androideabi/gnutls/lib'
    touch .gnutls

    配置NEON相关信息(一般编译的时候,会编译NO_NEON和支持NEON两种包出来),配置后该错误解决。即在.bash_profile 添加export NO_NEON=1

    6. command not found
    这个错误应该是根据具体环境具体配置的,在编译过程中,我遇到的有好几个

    -e \e[1m\e[32msqlite source not found, downloading\e[0m
    ./compile-libvlc.sh: line 767: wget: command not found
    ./compile-libvlc.sh: line 768: sha1sum: command not found
    Wrong sha1 for sqlite-autoconf-3180000.tar.gz
    

    分析这个错误,首先有wget这个命令找不到,其次还有sha1sum也找不到,另外有个错误的验证Wrong sha1 for sqlite-autoconf-3180000.tar.gz
    所以前面的表格中
    这里写图片描述
    md5sha1sum还有wget就是因此安装的。
    使用brew install md5sha1sum安装第一个,然后同样使用brew install wget安装。
    这里其实是分析compile-libvlc.sh 这个编译脚本来解决问题,如下图:
    这里写图片描述
    首先使用wget下载这个包,但是环境缺少wget所以报错,其次进行包验证,因为缺少md5sha1sum所以也报错。
    7. 缺少依赖库报的错误

     What went wrong:
    A problem occurred configuring project ':vlc-android'.
    > Could not resolve all dependencies for configuration ':vlc-android:_chromeMIPS64SignedReleaseApkCopy'.
       > Could not resolve com.android.support.constraint:constraint-layout:1.1.0-beta1.
         Required by:
             project :vlc-android
          > Could not resolve com.android.support.constraint:constraint-layout:1.1.0-beta1.
             > Could not get resource 'https://maven.google.com/com/android/support/constraint/constraint-layout/1.1.0-beta1/constraint-layout-1.1.0-beta1.pom'.
                > Could not GET 'https://maven.google.com/com/android/support/constraint/constraint-layout/1.1.0-beta1/constraint-layout-1.1.0-beta1.pom'.
                   > No route to host
    

    这个错误同样可以在compile-libvlc.sh 中找到,在sdk manager中下载android support repository 以及google support repository这里也要保证网络,不然下载不下来。

    五.总结

    其实遇到的问题还有很多,只是没有及时总结,下次一定要注意。最后就一句话:就是干,不要怂,想尽办法解决就是。

    展开全文
  • 完整视频播放器封装

    千次阅读 2018-01-16 14:40:28
    2.3 最简单视频播放器参数设定 2.4 注意的问题 2.5 关于开源中的类说明 2.6 暴露接口让用户实现返回键和登录和购买会员点击事件逻辑 3.关于播放类型说明 3.1 普通视频播放 3.2 list页面视频播放 ...

    目录介绍

    • 1.关于此视频封装库介绍
    • 1.1 能够满足那些业务需求
    • 1.2 对比同类型的库有哪些优势
    • 2.关于使用方法说明
    • 2.1 关于gradle引用说明
    • 2.2 添加布局
    • 2.3 最简单的视频播放器参数设定
    • 2.4 注意的问题
    • 2.5 关于开源库中的类说明
    • 2.6 暴露接口让用户实现返回键和登录和购买会员点击事件逻辑
    • 3.关于播放类型说明
    • 3.1 普通视频播放
    • 3.2 list页面视频播放
    • 3.3 小窗口视频播放
    • 3.4 类似爱奇艺,优酷会员试看视频播放
    • 3.5 关于封装库中日志打印
    • 4.关于相关方法说明
    • 4.1 关于VideoPlayer类[播放器]中方法说明
    • 4.2 关于VideoPlayerController类[控制器]中方法说明
    • 4.3 关于对象的销毁
    • 5.关于封装的思路
    • 5.1 参考的案例思路
    • 5.2 封装的基本思路
    • 5.3 关于窗口切换分析
    • 5.4 关于VideoPlayerManager视频播放器管理器分析
    • 5.5 关于VideoPlayerController视频控制器分析
    • 5.6 关于InterVideoPlayer接口分析
    • 6.关于如何自定义你想要的视频播放模式
    • 6.1 自定义视频播放器
    • 7.关于效果图的展示
    • 7.1 效果图如下所示
    • 8.关于遇到的问题说明
    • 8.1 视频难点
    • 8.2 遇到的bug
    • 8.3 后期需要实现的功能
    • 9.关于版本更新说明
    • 9.1 V1.0.0 更新于2017年9月4日
    • 9.2 V1.0.1 更新于2017年11月18日
    • 9.3 v1.1.0 更新于2018年1月15日
    • 9.4 v1.1.1 更新于2018年1月18日
    • 10.关于参考文档说明
    • 10.1 参考的项目
    • 10.2 参考的博客
    • 11.关其他说明
    • 11.1 目前市场流行的视频框架
    • 11.2 如何选择合适的框架
    • 11.3 关于我的个人博客和站点

    本篇文章已授权微信公众号 鸿洋独家推荐

    好消息

    • 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计47篇[近20万字],转载请注明出处,谢谢!
    • 链接地址:https://github.com/yangchong211/YCBlogs
    • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!

    0.备注

    • 仿照爱奇艺,优酷播放器写的,十分感谢GitHub上大神前辈们的开源案例和思路。
    • 支持插入广告,设置视频观看权限,观看完后登录或者购买会员。我看到在star较多的项目issues中,有些人正好需要这个案例,库集成后直接通过代码调用即可,灵活且拓展性强。
    • 由于调到做视频的部门,因此此部分代码会持续更新,也欢迎同行提bug或者问题
    • 如果你觉得还可以,给个star吧!我也在持续学习中!!!
    • 项目地址:https://github.com/yangchong211/YCVideoPlayer

    1.关于此视频封装库介绍

    1.1 能够满足那些业务需求

    A基础功能

    • 1.1.1 能够自定义视频加载loading类型,设置视频标题,设置视频底部图片,设置播放时长等基础功能

    • 1.1.2 可以切换播放器的视频播放状态,播放错误,播放未开始,播放开始,播放准备中,正在播放,暂停播放,正在缓冲等等状态

    • 1.1.3 可以自由设置播放器的播放模式,比如,正常播放,全屏播放,和小屏幕播放。其中全屏播放支持旋转屏幕。

    • 1.1.4 可以支持多种视频播放类型,比如,原生封装视频播放器,还有基于ijkplayer封装的播放器。

    • 1.1.5 可以设置是否隐藏播放音量,播放进度,播放亮度等,可以通过拖动seekBar改变视频进度。还支持设置n秒后不操作则隐藏头部和顶部布局功能

    B高级功能

    • 1.1.6 支持一遍播放一遍缓冲的功能,其中缓冲包括两部分,第一种是播放过程中缓冲,第二种是暂停过程中缓冲

    • 1.1.7 基于ijkplayer的封装播放器,支持多种格式视频播放

    • 1.1.8 可以设置是否记录播放位置,设置播放速度,设置屏幕比例

    • 1.1.9 支持滑动改变音量【屏幕右边】,改变屏幕亮度【屏幕左边】,支持切换视频清晰度模式

    • 1.1.0 支持list页面中视频播放,滚动后暂停播放,播放可以自由设置是否记录状态。并且还支持删除视频播放位置状态。

    C拓展功能

    • C1产品需求:类似优酷,爱奇艺视频播放器部分逻辑。比如如果用户没有登录也没有看视频权限,则提示试看视频[自定义布局];如果用户没有登录但是有看视频权限,则正常观看;如果用户登录,但是没有充值会员,部分需要权限视频则进入试看模式,试看结束后弹出充值会员界面;如果用户余额不足,比如余额只有99元,但是视频观看要199元,则又有其他提示。

    • C2自身需求:比如封装好了视频播放库,那么点击视频上登录按钮则跳到登录页面;点击充值会员页面也跳到充值页面。这个通过定义接口,可以让使用者通过方法调用,灵活处理点击事件。

    • C.1.1 实现了上面两个需求,灵活可拓展性强。

    • C.1.2 对于设置视频的宽高,建议设置成4:3或者16:9或者常用比例,如果不是常用比例,则可能会有黑边。其中黑边的背景可以设置

    • C.1.3 可以设置播放有权限的视频时的各种文字描述,而没有把它写在封装库中,使用者自己设定

    • C.1.4 锁定屏幕功能

    D待添加功能

    • D.1.1 可以支持屏幕截图功能,视频添加水印效果
    • D.1.2 支持弹幕功能
    • D.1.3 后期待定

    1.2 对比同类型的库有哪些优势

    1.2.1目前仅仅查了下GitHub上项目

    • 目前GitHub上比较流行的库
    • 至于官方库就不说了,jiecao的库是基于ijkplayer视频框架,目前封装库有许多,下面几个只是star比较多,其中jiecao库比较类似。
    ijkplayer官方库
    https://github.com/Bilibili/ijkplayer
    Vitamio官方库
    https://github.com/yixia/VitamioBundle
    以jiecao为例的封装库
    https://github.com/JasonChow1989/JieCaoVideoPlayer-develop          2年前
    https://github.com/open-android/JieCaoVideoPlayer                   1年前
    https://github.com/lipangit/JiaoZiVideoPlayer                       4个月前
    https://github.com/CarGuo/GSYVideoPlayer
    其他库
    https://github.com/danylovolokh/VideoPlayerManager
    

    1.2.2 具有的优势

    • A.代码布局更加简洁,而且无多余代码
    • B.几乎没有多少淡黄色警告,关于注释,通过使用阿里编码插件检测后更加规范,我对代码有洁癖
    • C.视频播放器[负责播放],视频控制器[负责视频播放各种点击或者属性设置操作],控制器抽象类[定义属性抽象类,供子类实现],其他可以看代码。结构分层上比较清晰
    • D.几乎所有的方法或者重要的成员或者局部变量都有相关的注释,注释的内容非常详细
    • E.关于视频属性设置或者按钮点击事件,都可以通过设置相关方法灵活实现。
    • 首先这些库封装的思路和代码都不错,我也是借鉴他们的思路,在他们的思路上改进而封装的。
    • 相比来说代码结构更加清晰,举几个例子
    • 针对视频播放页面布局,由于视频播放状态众多,我封装这库不同状态布局有十几种,许多库的视图布局没注释,显示比较臃肿,如果修改或者定位,不熟悉或者好久不操作,都要花时间找。展示我的布局代码
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <!--https://github.com/yangchong211-->
        <!--如果你觉得好,请给个star,让更多人使用,避免重复造轮子-->
        <!--底图,主要是显示视频缩略图-->
        <ImageView
            android:id="@+id/image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:visibility="visible"/>
        <!--加载动画view-->
        <include layout="@layout/custom_video_player_loading"/>
        <!--改变播放位置-->
        <include layout="@layout/custom_video_player_change_position"/>
        <!--改变亮度-->
        <include layout="@layout/custom_video_player_change_brightness"/>
        <!--改变声音-->
        <include layout="@layout/custom_video_player_change_volume"/>
        <!--播放完成,你也可以自定义-->
        <include layout="@layout/custom_video_player_completed"/>
        <!--播放错误-->
        <include layout="@layout/custom_video_player_error"/>
        <!--顶部控制区-->
        <include layout="@layout/custom_video_player_top"/>
        <!--底部控制区-->
        <include layout="@layout/custom_video_player_bottom"/>
        <!--右下角初始显示的总时长-->
        <TextView
            android:id="@+id/length"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_marginBottom="12dp"
            android:layout_marginEnd="8dp"
            android:padding="4dp"
            android:visibility="visible"
            android:text="00:00"
            android:textColor="@android:color/white"
            android:textSize="12sp"/>
        <!--中间开始播放按钮-->
        <ImageView
            android:id="@+id/center_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:src="@drawable/ic_player_center_start"
            android:visibility="visible"/>
        <!--试看按钮-->
        <ImageView
            android:id="@+id/iv_try_see"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:src="@drawable/selector_try_see"
            android:visibility="gone"/>
        <!--试看布局,非会员显示该布局-->
        <include layout="@layout/custom_video_player_try_see"/>
    </RelativeLayout>
    

    2.关于使用方法说明

    2.1 关于gradle引用说明

    • 2.1.1直接引用这段代码就可以
    compile 'cn.yc:YCVideoPlayerLib:2.2' 
    

    2.2 添加布局

    • 注意,在实际开发中,由于Android手机碎片化比较严重,分辨率太多了,建议灵活设置布局的宽高比为4:3或者16:9或者你认为合适的,可以用代码设置。
    • 如果宽高比变形,则会有黑边
    <org.yczbj.ycvideoplayerlib.VideoPlayer
    	android:id="@+id/video_player"
    	android:layout_width="match_parent"
    	android:layout_height="240dp"/>
    

    2.3 最简单的视频播放器参数设定

    • 2.3.1 这个是最简单视频播放器的设置参数代码
    	//设置播放类型
    	// IjkPlayer or MediaPlayer
    	videoPlayer1.setPlayerType(VideoPlayer.TYPE_NATIVE);
    	//网络视频地址
    	String videoUrl = DataUtil.getVideoListData().get(0).getVideoUrl();
    	//设置视频地址和请求头部
    	videoPlayer1.setUp(videoUrl, null);
    	//是否从上一次的位置继续播放
    	videoPlayer1.continueFromLastPosition(true);
    	//设置播放速度
    	videoPlayer1.setSpeed(1.0f);
    	//创建视频控制器
    	VideoPlayerController controller = new VideoPlayerController(this);
    	controller.setTitle("办快来围观拉,自定义视频播放器可以播放视频拉");
    	//设置视频时长
    	controller.setLength(98000);
    	//设置5秒不操作后则隐藏头部和底部布局视图
    	controller.setHideTime(5000);
    	//controller.setImage(R.drawable.image_default);
    	ImageUtil.loadImgByPicasso(this, R.drawable.image_default, R.drawable.image_default, controller.imageView());
    	//设置视频控制器
    	videoPlayer1.setController(controller);
    
    • 2.3.2 关于模仿爱奇艺登录会员权限功能代码
    	//设置视频加载缓冲时加载窗的类型,多种类型
    	controller.setLoadingType(2);
    	ArrayList<String> content = new ArrayList<>();
    	content.add("试看结束,yc观看全部内容请开通会员1111。");
    	content.add("试看结束,yc观看全部内容请开通会员2222。");
    	content.add("试看结束,yc观看全部内容请开通会员3333。");
    	content.add("试看结束,yc观看全部内容请开通会员4444。");
    	controller.setMemberContent(content);
    	controller.setHideTime(5000);
    	//设置设置会员权限类型,第一个参数是否登录,第二个参数是否有权限看,第三个参数试看完后展示的文字内容,第四个参数是否保存进度位置
    	controller.setMemberType(false,false,3,true);
    	controller.imageView().setBackgroundResource(R.color.blackText);
    	//ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
    	//设置试看结束后,登录或者充值会员按钮的点击事件
    	controller.setOnMemberClickListener(new OnMemberClickListener() {
    		@Override
    		public void onClick(int type) {
    			switch (type){
    				case ConstantKeys.Gender.LOGIN:
    					//调到用户登录也米娜
    					startActivity(MeLoginActivity.class);
    					break;
    				case ConstantKeys.Gender.MEMBER:
    					//调到用户充值会员页面
    					startActivity(MeMemberActivity.class);
    					break;
    				default:
    					break;
    			}
    		}
    	});
    
    • 2.3.3其他设置,让体验更好
    • 如果是在Activity中的话,建议设置下面这段代码
        @Override
        protected void onStop() {
            super.onStop();
            VideoPlayerManager.instance().releaseVideoPlayer();
        }
    
        @Override
        public void onBackPressed() {
            if (VideoPlayerManager.instance().onBackPressed()) return;
            super.onBackPressed();
        }
    
    • 如果是在Fragment中的话,建议设置下面这段代码
        //在宿主Activity中设置代码如下
        @Override
        protected void onStop() {
            super.onStop();
            VideoPlayerManager.instance().releaseVideoPlayer();
        }
    
        @Override
        public void onBackPressed() {
            if (VideoPlayerManager.instance().onBackPressed()) return;
            super.onBackPressed();
        }
    
        //--------------------------------------------------
    
        //在此Fragment中设置代码如下
        @Override
        public void onStop() {
            super.onStop();
            VideoPlayerManager.instance().releaseVideoPlayer();
        }
    

    2.4 注意的问题

    • 2.4.1如果是全屏播放,则需要在清单文件中设置当前activity的属性值
    • android:configChanges 保证了在全屏的时候横竖屏切换不会执行Activity的相关生命周期,打断视频的播放
    • android:screenOrientation 固定了屏幕的初始方向
    • 这两个变量控制全屏后和退出全屏的屏幕方向
    	<activity android:name=".ui.test2.TestMyActivity"
    		android:configChanges="orientation|keyboardHidden|screenSize"
    		android:screenOrientation="portrait"/>
    

    2.5 关于开源库中的类说明

    • image

    2.6 暴露接口让用户实现返回键和登录和购买会员点击事件逻辑

    	controller.setOnMemberClickListener(new OnMemberClickListener() {
    		@Override
    		public void onClick(int type) {
    			switch (type){
    				case ConstantKeys.Gender.LOGIN:
    					//调到用户登录也米娜
    					startActivity(MeLoginActivity.class);
    					break;
    				case ConstantKeys.Gender.MEMBER:
    					//调到用户充值会员页面
    					startActivity(MeMemberActivity.class);
    					break;
    				default:
    					break;
    			}
    		}
    	});
    	controller.setOnVideoBackListener(new OnVideoBackListener() {
    		@Override
    		public void onBackClick() {
    			onBackPressed();
    		}
    	});
    

    3.关于播放类型说明

    3.1 普通视频播放

    • 3.1.1 这一步操作可以直接看第二部分内容——关于使用方法说明

    3.2 list页面视频播放

    • 3.2.1如何在list页面设置视频
    • 第一步:在activity或者fragment中
    	recyclerView.setLayoutManager(new LinearLayoutManager(this));
    	recyclerView.setHasFixedSize(true);
    	VideoAdapter adapter = new VideoAdapter(this, DataUtil.getVideoListData());
    	recyclerView.setAdapter(adapter);
    	//注意:下面这个方法不能漏掉
    	recyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
    		@Override
    		public void onViewRecycled(RecyclerView.ViewHolder holder) {
    			VideoPlayer videoPlayer = ((VideoAdapter.VideoViewHolder) holder).mVideoPlayer;
    			if (videoPlayer == VideoPlayerManager.instance().getCurrentVideoPlayer()) {
    				VideoPlayerManager.instance().releaseVideoPlayer();
    			}
    		}
    	});
    
    • 第二步:在RecyclerView的适配器Adapter中
    public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHolder> {
    
        private Context mContext;
        private List<Video> mVideoList;
    
        VideoAdapter(Context context, List<Video> videoList) {
            mContext = context;
            mVideoList = videoList;
        }
    
        @Override
        public VideoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_test_my_video, parent, false);
            VideoViewHolder holder = new VideoViewHolder(itemView);
            //创建视频播放控制器,主要只要创建一次就可以呢
            VideoPlayerController controller = new VideoPlayerController(mContext);
            holder.setController(controller);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(VideoViewHolder holder, int position) {
            Video video = mVideoList.get(position);
            holder.bindData(video);
        }
    
        @Override
        public int getItemCount() {
            return mVideoList==null ? 0 : mVideoList.size();
        }
    
        class VideoViewHolder extends RecyclerView.ViewHolder {
    
            VideoPlayerController mController;
            VideoPlayer mVideoPlayer;
    
            VideoViewHolder(View itemView) {
                super(itemView);
                mVideoPlayer = (VideoPlayer) itemView.findViewById(R.id.nice_video_player);
                // 将列表中的每个视频设置为默认16:9的比例
                ViewGroup.LayoutParams params = mVideoPlayer.getLayoutParams();
                // 宽度为屏幕宽度
                params.width = itemView.getResources().getDisplayMetrics().widthPixels;
                // 高度为宽度的9/16
                params.height = (int) (params.width * 9f / 16f);
                mVideoPlayer.setLayoutParams(params);
            }
    
            /**
             * 设置视频控制器参数
             * @param controller            控制器对象
             */
            void setController(VideoPlayerController controller) {
                mController = controller;
                mVideoPlayer.setController(mController);
            }
    
            void bindData(Video video) {
                mController.setTitle(video.getTitle());
                mController.setLength(video.getLength());
                Glide.with(itemView.getContext())
                        .load(video.getImageUrl())
                        .placeholder(R.drawable.image_default)
                        .crossFade()
                        .into(mController.imageView());
                mVideoPlayer.setUp(video.getVideoUrl(), null);
            }
        }
    }
    

    3.3 小窗口视频播放

    • 3.3.1建议在设置小窗口先先判断视频播放器是否开始播放
    	if (videoPlayer.isIdle()) {
    		Toast.makeText(this, "要点击播放后才能进入小窗口", Toast.LENGTH_SHORT).show();
    	} else {
    		videoPlayer.enterTinyWindow();
    	}
    

    3.4 类似爱奇艺,优酷会员试看视频播放

    • 3.4.1 可以参考——2.3.2 关于模仿爱奇艺登录会员权限功能代码

    3.5 关于封装库中日志打印

    • 3.5.1关于封装库中日志打印设置
    • 如果上线产品后不想打印日志,可以在初始化时设置,注意需要在初始化播放器之前设置
        //如果不想打印库中的日志,可以设置
        VideoLogUtil.isLog = false;
    
    • 3.5.3关于日志工具类代码
        public class VideoLogUtil {
        
            private static final String TAG = "YCVideoPlayer";
            public static boolean isLog = true;
        
            static void d(String message) {
                if(isLog){
                    Log.d(TAG, message);
                }
        
            }
        
            static void i(String message) {
                if(isLog){
                    Log.i(TAG, message);
                }
        
            }
        
            static void e(String message, Throwable throwable) {
                if(isLog){
                    Log.e(TAG, message, throwable);
                }
            }
        }
    

    4.关于相关方法说明

    4.1 关于VideoPlayer类中方法说明

    • 4.1.1 关于一定需要这四步
    	//设置播放类型
    	// IjkPlayer or MediaPlayer
    	videoPlayer1.setPlayerType(VideoPlayer.TYPE_NATIVE);
    	//设置视频地址和请求头部
    	videoPlayer1.setUp(videoUrl, null);
    	//创建视频控制器
    	VideoPlayerController controller = new VideoPlayerController(this);
    	//设置视频控制器
    	videoPlayer1.setController(controller);
    
    • 4.1.2 关于VideoPlayer中设置属性方法
    	//设置播放类型
    	// MediaPlayer
    	videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
    	// IjkPlayer
    	videoPlayer.setPlayerType(VideoPlayer.TYPE_IJK);
    	//网络视频地址
    	String videoUrl = DataUtil.getVideoListData().get(1).getVideoUrl();
    	//设置视频地址和请求头部
    	videoPlayer.setUp(videoUrl, null);
    	//是否从上一次的位置继续播放
    	videoPlayer.continueFromLastPosition(false);
    	//设置播放速度
    	videoPlayer.setSpeed(1.0f);
    	//设置播放位置
    	//videoPlayer.seekTo(3000);
    	//设置音量
    	videoPlayer.setVolume(50);
    
    	//设置全屏播放
    	videoPlayer.enterFullScreen();
    	//设置小屏幕播放
    	videoPlayer.enterTinyWindow();
    	//退出全屏
    	videoPlayer.exitFullScreen();
    	//退出小窗口播放
    	videoPlayer.exitTinyWindow();
    	//释放,内部的播放器被释放掉,同时如果在全屏、小窗口模式下都会退出
    	videoPlayer.release();
    	//释放播放器,注意一定要判断对象是否为空,增强严谨性
    	videoPlayer.releasePlayer();
    
    • 4.1.3 关于VideoPlayer中获取属性方法
            //是否从上一次的位置继续播放,不必须
            videoPlayer.continueFromLastPosition(false);
            //获取最大音量
            int maxVolume = videoPlayer.getMaxVolume();
            //获取音量值
            int volume = videoPlayer.getVolume();
            //获取持续时长
            long duration = videoPlayer.getDuration();
            //获取播放位置
            long currentPosition = videoPlayer.getCurrentPosition();
            //获取缓冲区百分比
            int bufferPercentage = videoPlayer.getBufferPercentage();
            //获取播放速度
            float speed = videoPlayer.getSpeed(1);
    
    • 4.1.4 关于VideoPlayer中设置播放状态方法
    	//开始播放
    	videoPlayer.start();
    	//开始播放,从某位置播放
    	videoPlayer.start(3000);
    	//重新播放
    	videoPlayer.restart();
    	//暂停播放
    	videoPlayer.pause();
    
    • 4.1.5 关于VideoPlayer中获取播放状态方法
    	//判断是否开始播放
    	boolean idle = videoPlayer.isIdle();
    	//判断视频是否播放准备中
    	boolean preparing = videoPlayer.isPreparing();
    	//判断视频是否准备就绪
    	boolean prepared = videoPlayer.isPrepared();
    	//判断视频是否正在缓冲
    	boolean bufferingPlaying = videoPlayer.isBufferingPlaying();
    	//判断是否是否缓冲暂停
    	boolean bufferingPaused = videoPlayer.isBufferingPaused();
    	//判断视频是否暂停播放
    	boolean paused = videoPlayer.isPaused();
    	//判断视频是否正在播放
    	boolean playing = videoPlayer.isPlaying();
    	//判断视频是否播放错误
    	boolean error = videoPlayer.isError();
    	//判断视频是否播放完成
    	boolean completed = videoPlayer.isCompleted();
    	//判断视频是否播放全屏
    	boolean fullScreen = videoPlayer.isFullScreen();
    	//判断视频是否播放小窗口
    	boolean tinyWindow = videoPlayer.isTinyWindow();
    	//判断视频是否正常播放
    	boolean normal = videoPlayer.isNormal();
    

    4.2 关于VideoPlayerController类[控制器]中方法说明

    • 4.2.1 关于控制器方法
    	//创建视频控制器
    	VideoPlayerController controller = new VideoPlayerController(this);
    	//设置视频标题
    	controller.setTitle("高仿优酷视频播放页面");
    	//设置视频时长
    	//controller.setLength(98000);
    	//设置视频加载缓冲时加载窗的类型,多种类型
    	controller.setLoadingType(2);
    	ArrayList<String> content = new ArrayList<>();
    	content.add("试看结束,观看全部内容请开通会员1111。");
    	content.add("试看结束,观看全部内容请开通会员2222。");
    	content.add("试看结束,观看全部内容请开通会员3333。");
    	content.add("试看结束,观看全部内容请开通会员4444。");
    	//设置会员权限话术内容
    	controller.setMemberContent(content);
    	//设置不操作后,5秒自动隐藏头部和底部布局
    	controller.setHideTime(5000);
    	//设置设置会员权限类型,第一个参数是否登录,第二个参数是否有权限看,第三个参数试看完后展示的文字内容,第四个参数是否保存进度位置
    	controller.setMemberType(false,false,3,true);
    	//设置背景图片
    	controller.imageView().setBackgroundResource(R.color.blackText);
    	//ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
    	//设置试看结束后,登录或者充值会员按钮的点击事件
    	controller.setOnMemberClickListener(new OnMemberClickListener() {
    		@Override
    		public void onClick(int type) {
    			switch (type){
    				case ConstantKeys.Gender.LOGIN:
    					//调到用户登录也米娜
    					startActivity(MeLoginActivity.class);
    					break;
    				case ConstantKeys.Gender.MEMBER:
    					//调到用户充值会员页面
    					startActivity(MeMemberActivity.class);
    					break;
    				default:
    					break;
    			}
    		}
    	});
    	//设置视频清晰度
    	//videoPlayer.setClarity(list,720);
    	//设置视频控制器
    	videoPlayer.setController(controller);
    

    4.3 关于对象的销毁

    • 4.3.1在VideoPlayer中如何释放资源的呢?源代码如下所示
        @Override
        public void release() {
            // 保存播放位置
            if (isPlaying() || isBufferingPlaying() || isBufferingPaused() || isPaused()) {
                VideoPlayerUtils.savePlayPosition(mContext, mUrl, getCurrentPosition());
            } else if (isCompleted()) {
                //如果播放完成,则保存播放位置为0,也就是初始位置
                VideoPlayerUtils.savePlayPosition(mContext, mUrl, 0);
            }
            // 退出全屏或小窗口
            if (isFullScreen()) {
                exitFullScreen();
            }
            if (isTinyWindow()) {
                exitTinyWindow();
            }
            mCurrentMode = MODE_NORMAL;
    
            // 释放播放器
            releasePlayer();
    
            // 恢复控制器
            if (mController != null) {
                mController.reset();
            }
            // gc回收
            Runtime.getRuntime().gc();
        }
        //释放播放器,注意一定要判断对象是否为空,增强严谨性
        @Override
        public void releasePlayer() {
            if (mAudioManager != null) {
                //放弃音频焦点。使以前的焦点所有者(如果有的话)接收焦点。
                mAudioManager.abandonAudioFocus(null);
                //置空
                mAudioManager = null;
            }
            if (mMediaPlayer != null) {
                //释放视频焦点
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
            //从视图中移除TextureView
            mContainer.removeView(mTextureView);
            if (mSurface != null) {
                mSurface.release();
                mSurface = null;
            }
            //如果SurfaceTexture不为null,则释放
            if (mSurfaceTexture != null) {
                mSurfaceTexture.release();
                mSurfaceTexture = null;
            }
            //设置状态
            mCurrentState = STATE_IDLE;
        }
    

    5.关于封装的思路

    5.1 参考的案例思路

    • 5.1.1目前参考的案例有
    • 可以直接看下面的参考案例,有记录
    • 5.1.2针对jiaozi代码简单分析
    • JZVideoPlayer为继承自FrameLayout实现的一个组合自定义View来实现了视频播放器的View相关的内容。
    • JZVideoPlayerStandard则是继承自JZVideoPlayer实现了一些自身的功能。
    • JZMediaManager是用来对于MediaPlayer的管理,对于MediaPlayer的一些监听器方法的回调和TextrueView的相关回调处理。
    • JZVideoPlayerManager管理JZVideoPlayer
    • 和自定义相关的工作,最主要是先继承JCVideoPlayerStandard
    • JZMediaSystem主要是实现系统的播放引擎
    • 不得不说,大神封装代码的思路以及代码逻辑的确很强
    • 关于封装库其他感受
    • 第一:不过,感觉大神更新频率大高,而且没有找到每次更新的日志说明,不知道大神又解决了那些bug
    • 第二:黄色警告多,而且注释少,因为视频封装库不像一般库,有时候需求不同,可拓展性要求高。除了自己继承JCVideoPlayerStandard创建视频播放器,其他如果想改代码,还是有点复杂的。
    • 第三:关于使用虽然很简单,但是在JZVideoPlayerStandard这个方法中,布局的对象都是用public修饰,如果你要想自己甚至某个控件背景或者图标等等,则要这样应用。如果你不去看看源代码中布局名称,你根本就不知道这个对象对应的是什么东西。对于不同修饰符,要合适的,如果不合适,那么就会有淡黄色警告。我看了buttonKnife,retrofit,阿里vlayout等等,可以说黄色警告很少……
      Picasso.with(this)
                    .load("http://jzvd-pic.nathen.cn/jzvd-pic/1bb2ebbe-140d-4e2e-abd2-9e7e564f71ac.png")
                    .into(jzVideo.thumbImageView);
    

    5.2 封装的基本思路

    • 5.2.1关于简单的思路分析
    • a1.可以把视频播放和设置视频属性控制器分离,对于VideoPlayer中,各种UI状态和操作反馈都封装到VideoPlayerController控制器里面。如果需要根据不同的项目需求来修改播放器的功能,就只重写VideoPlayerController就可以了。
    • a2.对于VideoPlayer这个类,可以先创建一个帧布局容器,然后在初始化的时候将视频播放器控制器放到里面,然后通过设置控制器来进行视频播放
    • a3.当调用了开始播放的方法后,就初始化播放器,包括原生的,还有IjkMediaPlayer
    • a4.而基于IjkMediaPlayer的视频播放,需要添加各种监听事件,通过阅读IMediaPlayer源码可以知道:可以在这些监听事件中添加各种对视频的操作逻辑,具体可以看代码。
        void setOnPreparedListener(IMediaPlayer.OnPreparedListener var1);
        void setOnCompletionListener(IMediaPlayer.OnCompletionListener var1);
        void setOnBufferingUpdateListener(IMediaPlayer.OnBufferingUpdateListener var1);
        void setOnSeekCompleteListener(IMediaPlayer.OnSeekCompleteListener var1);
        void setOnVideoSizeChangedListener(IMediaPlayer.OnVideoSizeChangedListener var1);
        void setOnErrorListener(IMediaPlayer.OnErrorListener var1);
        void setOnInfoListener(IMediaPlayer.OnInfoListener var1);
        void setOnTimedTextListener(IMediaPlayer.OnTimedTextListener var1);
    
    • a5.定义好了监听事件后,就创建了播放,重置播放,暂停等各种方法

    5.3 关于窗口切换分析

    • 5.3.1 关于窗口切换调用的代码
    	//设置全屏播放
    	videoPlayer.enterFullScreen();
    	//设置小屏幕播放
    	videoPlayer.enterTinyWindow();
    	//退出全屏
    	videoPlayer.exitFullScreen();
    	//退出小窗口播放
    	videoPlayer.exitTinyWindow();
    	//释放,内部的播放器被释放掉,同时如果在全屏、小窗口模式下都会退出
    	videoPlayer.release();
    	//释放播放器,注意一定要判断对象是否为空,增强严谨性
    	videoPlayer.releasePlayer();
    

    5.4 关于VideoPlayerManager视频播放器管理器分析

    • 5.4.1可以直接看源代码,我对每个方法都有详细的注释
    public class VideoPlayerManager {
    
        private VideoPlayer mVideoPlayer;
        private static VideoPlayerManager sInstance;
        private VideoPlayerManager() {}
        //一定要使用单例模式,保证同一时刻只有一个视频在播放,其他的都是初始状态
        public static synchronized VideoPlayerManager instance() {
            if (sInstance == null) {
                sInstance = new VideoPlayerManager();
            }
            return sInstance;
        }
    
        public VideoPlayer getCurrentVideoPlayer() {
            return mVideoPlayer;
        }
    
        void setCurrentVideoPlayer(VideoPlayer videoPlayer) {
            if (mVideoPlayer != videoPlayer) {
                releaseVideoPlayer();
                mVideoPlayer = videoPlayer;
            }
        }
        //当视频正在播放或者正在缓冲时,调用该方法暂停视频
        public void suspendVideoPlayer() {
            if (mVideoPlayer != null && (mVideoPlayer.isPlaying() || mVideoPlayer.isBufferingPlaying())) {
                mVideoPlayer.pause();
            }
        }
        //当视频暂停时或者缓冲暂停时,调用该方法重新开启视频播放
        public void resumeVideoPlayer() {
            if (mVideoPlayer != null && (mVideoPlayer.isPaused() || mVideoPlayer.isBufferingPaused())) {
                mVideoPlayer.restart();
            }
        }
        //释放,内部的播放器被释放掉,同时如果在全屏、小窗口模式下都会退出
        public void releaseVideoPlayer() {
            if (mVideoPlayer != null) {
                mVideoPlayer.release();
                mVideoPlayer = null;
            }
        }
         //处理返回键逻辑.如果是全屏,则退出全屏 如果是小窗口,则退出小窗口
        public boolean onBackPressed() {
            if (mVideoPlayer != null) {
                if (mVideoPlayer.isFullScreen()) {
                    return mVideoPlayer.exitFullScreen();
                } else if (mVideoPlayer.isTinyWindow()) {
                    return mVideoPlayer.exitTinyWindow();
                }
            }
            return false;
        }
    }
    

    5.5 关于VideoPlayerController视频控制器分析

    • 5.5.1VideoPlayerController的作用
    • 播放控制界面上,播放、暂停、播放进度、缓冲动画、全屏/小屏等触发都是直接调用播放器对应的操作的。
    • 5.5.2VideoPlayerController的方法如下所示
    	//创建视频控制器
    	VideoPlayerController controller = new VideoPlayerController(this);
    	//设置视频标题
    	controller.setTitle("高仿优酷视频播放页面");
    	//设置视频时长
    	//controller.setLength(98000);
    	//设置视频加载缓冲时加载窗的类型,多种类型
    	controller.setLoadingType(2);
    	ArrayList<String> content = new ArrayList<>();
    	content.add("试看结束,观看全部内容请开通会员1111。");
    	content.add("试看结束,观看全部内容请开通会员2222。");
    	content.add("试看结束,观看全部内容请开通会员3333。");
    	content.add("试看结束,观看全部内容请开通会员4444。");
    	//设置会员权限话术内容
    	controller.setMemberContent(content);
    	//设置不操作后,5秒自动隐藏头部和底部布局
    	controller.setHideTime(5000);
    	//设置设置会员权限类型,第一个参数是否登录,第二个参数是否有权限看,第三个参数试看完后展示的文字内容,第四个参数是否保存进度位置
    	controller.setMemberType(false,false,3,true);
    	//设置背景图片
    	controller.imageView().setBackgroundResource(R.color.blackText);
    	//ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
    	//设置试看结束后,登录或者充值会员按钮的点击事件
    	controller.setOnMemberClickListener(new OnMemberClickListener() {
    		@Override
    		public void onClick(int type) {
    			switch (type){
    				case ConstantKeys.Gender.LOGIN:
    					//调到用户登录也米娜
    					startActivity(MeLoginActivity.class);
    					break;
    				case ConstantKeys.Gender.MEMBER:
    					//调到用户充值会员页面
    					startActivity(MeMemberActivity.class);
    					break;
    				default:
    					break;
    			}
    		}
    	});
    	//设置视频清晰度
    	//videoPlayer.setClarity(list,720);
    	//设置视频控制器
    	videoPlayer.setController(controller);
    

    5.6 关于InterVideoPlayer接口分析

    • 5.6.1关于此接口方法有
    • 跟jiaozi代码类似
        /**
         * 设置视频Url,以及headers
         *
         * @param url           视频地址,可以是本地,也可以是网络视频
         * @param headers       请求header.
         */
        void setUp(String url, Map<String, String> headers);
    
        /**
         * 开始播放
         */
        void start();
    
        /**
         * 从指定的位置开始播放
         *
         * @param position      播放位置
         */
        void start(long position);
    
        /**
         * 重新播放,播放器被暂停、播放错误、播放完成后,需要调用此方法重新播放
         */
        void restart();
    
        /**
         * 暂停播放
         */
        void pause();
    
        /**
         * seek到制定的位置继续播放
         *
         * @param pos 播放位置
         */
        void seekTo(long pos);
    
        /**
         * 设置音量
         *
         * @param volume 音量值
         */
        void setVolume(int volume);
    
        /**
         * 设置播放速度,目前只有IjkPlayer有效果,原生MediaPlayer暂不支持
         *
         * @param speed 播放速度
         */
        void setSpeed(float speed);
    
        /**
         * 开始播放时,是否从上一次的位置继续播放
         *
         * @param continueFromLastPosition true 接着上次的位置继续播放,false从头开始播放
         */
        void continueFromLastPosition(boolean continueFromLastPosition);
    

    6.关于如何自定义你想要的视频播放模式

    6.1 自定义视频播放器

    • 6.1.1如何自定义自己的播放器
    • 第一步:首先继承VideoPlayer这个类
    • 第二步:然后重写部分你需要更改功能的方法,只需要选择你需要重写的方法即可。
    • 6.1.2代码展示如下所示
    	public class YCVideoPlayer extends VideoPlayer {
    
    		public YCVideoPlayer(Context context) {
    			super(context);
    		}
    
    		@Override
    		public void setUp(String url, Map<String, String> headers) {
    			super.setUp(url, headers);
    		}
    
    		@Override
    		public void setController(AbsVideoPlayerController controller) {
    			super.setController(controller);
    		}
    
    		@Override
    		public void setPlayerType(int playerType) {
    			super.setPlayerType(playerType);
    		}
    
    		@Override
    		public void continueFromLastPosition(boolean continueFromLastPosition) {
    			super.continueFromLastPosition(continueFromLastPosition);
    		}
    
    		@Override
    		public void setSpeed(float speed) {
    			super.setSpeed(speed);
    		}
    
    		@Override
    		public void start() {
    			super.start();
    		}
    
    		@Override
    		public void start(long position) {
    			super.start(position);
    		}
    
    		@Override
    		public void restart() {
    			super.restart();
    		}
    
    		@Override
    		public void pause() {
    			super.pause();
    		}
    
    		@Override
    		public void seekTo(long pos) {
    			super.seekTo(pos);
    		}
    
    		@Override
    		public void setVolume(int volume) {
    			super.setVolume(volume);
    		}
    
    		@Override
    		public boolean isIdle() {
    			return super.isIdle();
    		}
    
    		@Override
    		public boolean isPreparing() {
    			return super.isPreparing();
    		}
    
    		@Override
    		public boolean isPrepared() {
    			return super.isPrepared();
    		}
    
    		@Override
    		public boolean isBufferingPlaying() {
    			return super.isBufferingPlaying();
    		}
    
    		@Override
    		public boolean isBufferingPaused() {
    			return super.isBufferingPaused();
    		}
    
    		@Override
    		public boolean isPlaying() {
    			return super.isPlaying();
    		}
    
    		@Override
    		public boolean isPaused() {
    			return super.isPaused();
    		}
    
    		@Override
    		public boolean isError() {
    			return super.isError();
    		}
    	}
    

    7.关于效果图的展示

    7.1 效果图如下所示

    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image

    8.关于遇到的问题说明

    8.1 视频难点

    • 8.1.1 当视频切换全屏或者从全屏切换到正常小屏幕时,如何管理activity的生命周期
    • 8.1.2 在列表list页面,滑动显示小窗口,那么什么时候显示小窗口呢?关于RecyclerView的滑动位移超出屏幕有没有更好的解决办法?
    • 8.1.2 当屏幕从全屏退出时,播放位置要滑到记录的位置,代码逻辑复杂,如何避免耦合度太高

    8.2 遇到的bug

    • 8.2.1 当视频切花时,如何避免视频不卡顿
    • 8.2.2 在fragment中,当左右滑动出另一个fragment中,视频还在播放,怎么样处理这部分逻辑
    • 8.2.3 在显示缓冲比时,网络不好或者暂停缓冲时有问题,所以暂停还没有添加该功能
    • 8.2.4 播放进度条seekbar跳动问题,有人反映不是那么顺畅
    • 8.2.5 部分华为手机播放视频有问题,在找原因
    • 8.2.6 在拖动时显示当前帧的画面图片,类似优酷那个功能,最终还是没有实现

    8.3 后期需要实现的功能

    • 8.3.1 如果有多集视频,则添加上一集和下一集的功能
    • 8.3.2 拖动滑动条,显示帧画面
    • 8.3.3 实现弹幕功能
    • 8.4.4 有些手机播放有问题,测试找问题
    • 8.5.5 切换视频清晰度有问题,是重新开始播放,因为切换清晰度时,调用的视频链接是不同的。比如高清视频和标准视频链接是不同的,所以难以实现切换后记录位置播放。但是看了下优酷,爱奇艺视频,切换后是接着之前观看的位置播放,这个需要思考下怎么实现。欢迎同行给出好的建议。
    • 8.5.6 待定

    9.关于版本更新说明

    • 9.1 V1.0.0 更新于2017年10月4日

    初期最简单功能

    • 9.1.1 支持最简单视频播放,暂停,缓冲,全屏播放等基础功能。

    • 9.1.2 支持滑动改变音量,改变声音大小的功能

    • 9.1.3 还有其他基本功能

    • 9.2 V1.0.1 更新于2017年11月18日

    最简单的封装

    • 9.2.1 并且阅读相关视频案例,借鉴了相关思路和复用了部分代码

    • 测试环节

    • 9.3 v1.1.0 更新于2018年1月15日

    添加部分功能

    • 9.3.1 添加了设置视频播放权限的功能,用户可以自由设置权限,不过目前只是设置了用户是否登录,和登录用户是否有观看权限,因为公司需求是这样的,所以只有这两个。后期遇到其他需求再添加。逻辑已经在库中写好了,用户自己实现就可以呢。

    • 9.3.2 关于权限肯定有话术内容,那么用户可以通过调用接口直接设置展示在播放器试看结束后的内容。十分方便,这块参考了优酷和爱奇艺视频

    • 9.3.3 添加了用户多久不操作视频界面后,自动隐藏底部和头部布局视图。如果不设置,默认时间为5秒

    • 9.3.4 添加了多种视频加载时候的加载效果,目前有两种,一种是转圈效果,一种是帧动画效果。当然你可以自己添加动画加载效果

    • 9.4 v1.1.1 更新于2018年1月18日

    修改了部分bug

    • 9.4.1 修改了视频横向播放时,点击手机物理返回键,画面展示状态栏问题

    • 9.4.2 修改了在list页面(recyclerView)的视频,当上拉加载更多时,加载十几次会导致崩溃问题

    • 9.4.3 精简了布局文件,方便修改定制和阅读

    • 9.4.4 修改了在网络不好或者飞行模式下,用户播放视频,应该是播放错误而不是一直转圈加载问题

    • 9.4.5 完善了代码的注释,现在几乎所有的方法都有相关注释,方便阅读和理解。去掉了无用的代码

    添加了部分功能

    • 9.4.6 添加了暴露接口之用户登录和用户购买会员的接口,用户可以自己实现监听之后的操作或者跳转页面
    • 9.4.7 添加了视频左上方的返回键监听,用户可以自己实现返回逻辑
    • 9.4.8 添加了锁定屏幕方向的功能,还在测试中,有点问题

    10.关于参考文档说明

    10.1 参考的项目

    • 10.1.1参考的开源项目有
    https://github.com/CarGuo/GSYVideoPlayer
    https://github.com/danylovolokh/VideoPlayerManager
    https://github.com/HotBitmapGG/bilibili-android-client
    https://github.com/jjdxmashl/jjdxm_ijkplayer
    https://github.com/JasonChow1989/JieCaoVideoPlayer-develop          2年前
    https://github.com/open-android/JieCaoVideoPlayer                   1年前
    https://github.com/lipangit/JiaoZiVideoPlayer                       4个月前
    https://github.com/xiaoyanger0825/NiceVieoPlayer
    https://github.com/curtis2/SuperVideoPlayer
    https://github.com/tcking/GiraffePlayer
    

    10.2 参考的博客

    • 10.2.1参考的博客有
    https://segmentfault.com/a/1190000011959615
    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1213/2153.html
    http://blog.csdn.net/junwang19891012/article/details/8444743
    https://www.jianshu.com/p/420f7b14d6f6
    http://blog.csdn.net/candicelijx/article/details/39495271
    

    11.关其他说明

    11.1 目前市场流行的视频框架

    • 1.Android原生VideoView
    • 2.Google 开源视频播放框架 ExoPlayer
    • 3.Vitamio 视频播放框架
    • 4.Bilibili 开源视频播放框架ijkplayer

    11.2 如何选择

    • 11.2.1.Android原生VideoView
    • 1.1 VideoView 的使用非常简单,播放视频的步骤:
      • 在界面布局文件中定义 VideoView 组件,或在程序中创建 VideoView 组件
      • 调用 VideoView 的如下两个方法来加载指定的视频:
        • setVidePath(String path):加载 path 文件代表的视频
        • setVideoURI(Uri uri):加载 uri 所对应的视频
      • 调用 VideoView 的 start()、stop()、psuse() 方法来控制视频的播放
    • 11.2.2.Google 开源视频播放框架 ExoPlayer
    • 2.1 框架地址:https://github.com/google/ExoPlayer
    • 2.2 用法
      • ExoPlayer 开源项目包含了 library 和 示例:
        • ExoPlayer library – 这部分是核心的库
        • Demo app – 这部分是演示怎么使用 ExoPlayer 的 Demo
      • ExoPlayer 库的核心类是 ExoPlayer 类。该类维护了播放器的全局状态 。比如如何获取媒体数据,如何缓冲以及是怎样的编码格式。
      • ExoPlayer 基于 MediaCodec 和 AudioTrack 提供了默认的音视频的 TrackRenderer 实现。所有的 renderers 都需要 SampleSource 对象,ExoPlayer 从 SampleSource 获得 media samples 用于播放。下图展示了 ExoPlayer 是如何配置组合这些组件用于播放音视频的。
      • standard-model
      • 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 方法。
    • 2.3 优缺点
    • 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 版本。
    • 11.2.3.Vitamio 视频播放框架
    • 3.1 用法
    • 官网:https://www.vitamio.org
    • Vitamio 的使用步骤:
      • 1.下载 Vitamio 库,并作为工程依赖。
      • 2.在 Activity 的 onCreate 方法中添加如下代码,初始化 Vitamio 的解码器
    • 3.2 优点
      • 强大,支持超多格式视频和网络视频播放。
      • 使用简单。调用非常简单,方便使用。
      • 其官方还给出了其他很多优点,但是个人觉得不足以成为优点。
    • 11.2.4.Bilibili 开源视频播放框架ijkplayer
    • 4.1 特点
      • HTTPS支持
      • 支持弹幕
      • 支持基本的拖动,声音、亮度调节
      • 支持边播边缓存
      • 支持视频本身自带rotation的旋转(90,270之类),重力旋转与手动旋转的同步支持
      • 支持列表播放,直接添加控件为封面,列表全屏动画,视频加载速度,列表小窗口支持拖动
      • 5.0的过场效果,调整比例,多分辨率切换
      • 支持切换播放器,进度条小窗口预览
      • 其他一些小动画效果,rtsp、concat、mpeg
    • 4.2 优缺点
      • ijkplayer 最大的优点就是可以根据需要编译需要的解码器。在编译的时候通过 ln -s module-default.sh module.sh 选择要编译的解码器。ijkplayer 在 config 目录下提供了三种 module.sh 。也可自己修改 module.sh
      • ijkplayer 的缺点是库太大。加入项目后会大大增加你的 APP 的大小。

    11.3 关于我的个人博客和站点

    展开全文
  • 轻量级视频选择

    千次阅读 2018-05-30 14:56:23
    单纯的视频选择可设置主题颜色,录制视频长度等功能。简单便捷githuab:https://github.com/yayo292916/SelectVideo##导入方法 allprojects { repositories { ... maven { url 'https://jitpack.io' } ...


    单纯的视频选择库

    可设置主题颜色,录制视频长度等功能。简单便捷

    github:https://github.com/yayo292916/SelectVideo

    ##导入方法
    	allprojects {
    		repositories {
    			...
    			maven { url 'https://jitpack.io' }
    		}
    	}
      
      dependencies {
    	        compile 'com.github.yayo292916:SelectVideo:1.0.1'
    	}
    
    ##使用方法
    SelectVideo.Builder builder = new SelectVideo.Builder();
            builder.setContext(context)
                    .setRecordTime(30)  //录制最长时间
                    .setTag(105)    //返回的 requestCode 值
                    .build();
    		
    		
    ##构建好以后,一行代码打开	
    
        builder.openSelectVideo();
    
    
    ##获取选择后的数据
    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (data == null)
                return;
            if (requestCode == builder.getTag()) {
               String videoPath = data.getStringExtra("videoPath");
                Toast.makeText(context,videoPath,Toast.LENGTH_SHORT).show();
                Glide.with(context).load(videoPath).into(img);
            }
        }
    展开全文
  • windows 视频采集开源

    千次阅读 2014-11-16 06:51:41
    现在进行windows上视频采集,主要的有 opencv ffmpeg videoinpu
  • Android视频缓存支持

    千次阅读 2017-05-16 13:17:09
    Android视频缓存支持公司是做线上教育的,在整个服务器的成本中,我们发现存储的成本很低约占总支出的5%,流量成本大约占95%,所以视频缓存势在必行。经过调研在github上找到了一个很不错的第三方缓存库...
  • iOS视频编解码常用比较

    千次阅读 2017-08-03 22:05:12
    主流跨平台媒体ffmpeg,live555,MobileVLCKit简介 ...FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。...它提供了录制、转换...它包含了非常先进的音频/视频编解码libav
  • C++ 视频播放开源

    千次阅读 2019-10-09 16:03:49
    优点:配置简单,功能比较好,适合很多格式视频 缺点:控制不太流畅,例如play和pause没有间隔一起调用,有很大几率pause不起作用 2.FFmpeg 优点:功能强大 缺点:配置有点复杂 3.opencv 优点:可以访问每一帧...
  • 前段时间做了个小项目用的便是jiecaovideoplayer开源 原项目GitHub地址:https://github.com/lipangit/JieCaoVideoPlayer 1、添加gradle的依赖compile 'fm.jiecao:jiecaovideoplayer:4.8.3' compile '...
  • FreeSWITCH使用了大量的第三方,本文档主要介绍视频相关的信息: 音频相关的信息介绍参考:https://blog.csdn.net/acliyu/article/details/81556742 其他相关的信息介绍参考:...
  • 本文记录另一个安卓平台下基于FFmpeg的视频解码器。...该视频解码器C语言的源代码来自于《最简单的基于FFMPEG+SDL的视频播放器》。相关的概念就不再重复记录了。FFmpeg类库的打包记录一下FFmpeg类库打包的方
  • 简易版DirectUI构建》视频教程(共17讲) 已经全部发布 这只是一个教程,和什么商业产品无关,教大家认识什么是DirectUI、如何实现. [url=http://www.tudou.com/playlist/id16126336.html][img=...
  • 使用开源SiliCompressor对视频进行压缩处理

    千次阅读 热门讨论 2018-11-15 15:34:40
    最近公司项目中需要上传视频,由于之前没有涉及过,初步可以上传了,但由于一般手机本地视频文件都很大,所以得在上传之前进行压缩处理,在百度,github上各种找。在此做个记录也希望能帮到一些需要的人,少走一些...
  • MoviePy - 中文文档(一个专业的python视频编辑)教程

    万次阅读 多人点赞 2018-07-11 15:00:30
    MoviePy是一个用于视频编辑的python模块,你可以用它实现一些基本的操作(比如视频剪辑,视频拼接,插入标题),还可以实现视频合成,还有视频处理,抑或用它加入一些自定义的高级的特效。总之,它的功能还是蛮丰富的。...
  • RecorderManager安卓仿微信自定义音视频录制第三方

    万次阅读 热门讨论 2019-01-29 18:07:45
    因为在项目中经常需要使用音视频录制,所以写了一个公共RecorderManager,欢迎大家使用。 一.效果展示 仿微信界面视频录制 2.音频录制界面比较简单,就不放图了 二.引用 1.Add it in your root build....
  • J2EE中使用MediaInfo获取视频信息

    千次阅读 2013-10-11 21:50:06
    MediaInfo 用来分析视频和音频文件的编码和内容信息,是一款是自由软件 (免费使用、免费获得源代码)。 我在J2EE项目软件中集成了它的DLL,很好用。 下面简单记录一下它的使用方法。 (系统开发平台是MyEclipse) 1....
  • QT编写的简易安防视频监控系统

    千次下载 热门讨论 2014-07-19 17:46:25
    4:精简代码 在windows下是可以完整编译通过并运行的 linux下要将对应ffmpeg文件替换 5:代码处理并不够完整 还有很多需要优化的地方 6:代码注释不够详尽 但是简单易懂 7:没有使用定时器 采用信号槽机制实现视频...
  • GitHub 超 20000 Star,最火开源视频库 FFmpeg 这 20 年!

    千次阅读 多人点赞 2020-12-24 15:27:58
    先后就职于德国 BOSCH,iBabyLabs 等企业担任主程, 精通嵌入式 Linux、iOS、Android 底层开发,音视频、网络通讯协议/流媒体开发,精通 Qt、FFmpeg、Metal、OpenGL 等开发。 更多精彩推荐 ☞曾被“劝退”的 C++ 20...
  • 关于moviepy的两个专栏是老猿阅读moviepy当前最新版本1.0.3的文档、源代码以及大量测试的基础上总结的MoviePy学习教程,本文将两个专栏的核心知识点,包括重要类的相关方法及作用、视频音频剪辑变换方法、场景式的...
  • C++中使用MediaInfo获取视频信息

    万次阅读 多人点赞 2013-09-22 16:58:55
    MediaInfo 用来分析视频和音频文件的编码和内容信息,是一款是自由软件 (免费使用、免费获得源代码)。 我在项目软件中集成了它的DLL,发现真的是非常好用! 下面简单记录一下它的使用方法。 (系统开发平台是VC2010...
  • WebRtc音视频实时通信--libnice介绍

    千次阅读 2017-08-20 15:31:17
    注:本篇中不清楚的概念的可以参考“WebRtc音视频实时通信–基本术语 ”WebRtc音视频实时通信–基本术语 libnice介绍: libnice是基于ICE协议实现的一套通信连接。 主要功能是实现p2p连接及媒体数据流...
  • Android音视频编解码MediaCodec

    千次阅读 2018-04-16 09:00:51
    如果您想要使用视频使用者本地处理原始输入视频缓冲区 - 处理原始视频输入的编解码器(例如视频编码器) - 使用配置后的createInputSurface()为输入数据创建目标Surface。 或者,通过调用setInputSurface(Surface...
  • pytube——下载YouTube视频的python

    千次阅读 2017-05-22 13:39:33
    pytube是用python写的轻量级,它没有第三方的依赖并且目的是为了变得高度可靠。 pytube没有假定,意思是没有内建的方法获得‘最’高质量的视频。pytube仅仅给出了所有可以获得的形式和方法,给开发者自己
  • android平台的视频播放LanSoSdk发布地址. 地址:https://github.com/LanSoSdk/LanSoSdkPlayDemo 这是我们的视频SDK播放器演示程序,全面支持软解和硬解,接口简单,欢迎下载使用. 我们有更专业稳定可靠的SDK包, 期待...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 204,800
精华内容 81,920
关键字:

简单视频库