《FFmpeg开发实战:从零基础到短视频上线》一书的“第 12 章  FFmpeg的移动开发”介绍了如何使用FFmpeg在手机上播放视频,基于FFmpeg的国产播放器开源框架也有很多了,前有哔哩哔哩的ijkplayer,后有小红书的RedPlayer,参见之前的文章《使用国产的ijkplayer播放器观看网络视频》和《使用国产的RedPlayer播放器观看网络视频》。

除此以外,NextPlayer也是一款优秀的Android原生播放器,该框架采用Kotlin+Compose开发,贴近最新的Android开发技术。NextPlayer支持的视频编码格式包括H.263、H.264(AVC)、H.265(HEVC)、MPEG-4 SP、VP8、VP9、AV1等,支持的音频编码格式包括Vorbis、Opus、FLAC、ALAC、PCM/WAVE、MP1、MP2、MP3、AMR、AAC 等,支持的字幕格式包括SRT、SSA、ASS、TTML、VTT、DVB等,可谓博采众长。

NextPlayer的源码托管地址为https://github.com/anilbeesetti/nextplayer(星星数2.8k),国内的镜像地址为https://gitcode.com/gh_mirrors/ne/nextplayer,最新版本是2025年1月发布的NextPlayer v0.13.0,可见该框架的源码更新十分及时。并且NextPlayer的源码采用Kotlin+Compose编写,适合Android开发者用作进阶练习,不过由于NextPlayer引入了最新的Android开发技术,因此需要使用较新的Android Studio才能成功导入运行。

接下来以Android Studio Ladybug(小瓢虫版本)为例,介绍如何通过Android Studio编译运行NextPlayer的demo工程。

使用Android Studio导入nextplayer工程之后,Gradle会报错“The project is using an incompatible version (AGP 8.10.1) of the Android Gradle plugin. Latest supported version is AGP 8.7.2”。这是因为nextplayer工程用到的Gradle插件版本8.10.1太高了,需要降级降到8.7.2。于是打开nextplayer/gradle/libs.versions.toml,把下面这行

androidGradlePlugin = "8.10.1"

改为下面这行,也就是把androidGradlePlugin版本号从8.10.1降到8.7.2。

androidGradlePlugin = "8.7.2"

继续编译nextplayer工程,Gradle又报错“Inconsistent JVM-target compatibility detected for tasks 'compileJava' (21)”。这是因为nextplayer工程用的JVM版本为17,而Android Studio Ladybug默认安装的JVM版本为21,所以需要把nextplayer工程的JVM版本从17升级到21。于是打开nextplayer/gradle/libs.versions.toml,把下面这行

android-jvm = "17"

改为下面这行,也就是把android-jvm版本号从17升到21。

android-jvm = "21"

等待nextplayer工程编译通过,把demo应用安装到手机上,启动之后的App界面如下图所示:

可见NextPlayer会自动搜索手机上的视频目录。进入某个目录后选择一个视频,NextPlayer就打开全屏播放窗口如下图所示:

点击播放界面右上角的音符图标,弹出音轨选择窗口如下图所示:

总结一下,NextPlayer确实使用简单,播放功能也丰富,是个未来可期的下一代播放器。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

FFmpeg开发笔记(七十八)采用Kotlin+Compose的NextPlayer播放器的更多相关文章

  1. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  2. 安卓开发笔记(十八):实现button按钮事件的三种方法

    Android开发中有三种主要的方式用于设置View的点击事件,1.创建内部类:2.主类中实现OnClickListener接口:3.使用匿名内部类.这三种方式都用到了OnClickListener接 ...

  3. .net开发笔记(十八) winform中的等待框

    winform中很多任务是需要在后台线程(或类似)中完成的,也就是说,经常容易涉及到UI界面与后台工作线程之间的交互.比如UI界面控制后台工作的执行(启动.暂停.停止等),后台工作进度在UI界面上的显 ...

  4. Java开发笔记(十八)上下求索的while循环

    循环是流程控制的又一重要结构,“白天-黑夜-白天-黑夜”属于时间上的循环,古人“年复一年.日复一日”的“日出而作.日落而息”便是每天周而复始的生活.计算机程序处理循环结构时,给定一段每次都要执行的代码 ...

  5. JSP学习笔记(七十八):struts2中s:select标签的使用

    1.第一个例子: <s:select list="{'aa','bb','cc'}" theme="simple" headerKey="00& ...

  6. Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件

    前言   上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤.   受限制   因为直接配置sample的vi比较麻烦 ...

  7. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  9. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  10. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

随机推荐

  1. 设计模式之“外观模式(门面模式)(Facade)”

    一.外观模式 1.概念 为子系统中的一组接口提供一个一致的界面 此模式定义了一个高层接口 这个接口使得这一子系统更加容易使用 他完美的体现了依赖倒转原则和迪米特法则的思想,是常用模式之一 2.何时使用 ...

  2. 从Tushare获取历史行情数据

    从Tushare获取历史行情数据,分为两种,一种是后复权(daily_hfq)数据,一种是不复权(daily)数据,获取到的数据存储在MongoDB数据库中,每个集合(collection)中,数据字 ...

  3. INotifyCollectionChanged 用法简介

    INotifyCollectionChanged 接口是 System.Collections.Specialized 命名空间中的一个接口,用于在集合发生更改时通知订阅者.这个接口通常在实现了集合的 ...

  4. ✨生物大语言模型Evo2——解码基因密码的AI革命🚀

    2025:生物AI的"DeepSeek时刻" 当整个中文互联网为国产大语言模型DeepSeek欢呼时,生命科学界正悄然掀起一场静默革命--由Arc Institute领衔,斯坦福. ...

  5. codeup之输出梯形

    Description 输入一个高度h,输出一个高为h,上底边为h的梯形. Input 一个整数h(1<=h<=1000). Output h所对应的梯形. Sample Input Co ...

  6. 预编译语法_sql注入技巧

    预编译可以将一串命令提前编译成可执行文件 可以用于被过滤或检测到的字眼分割成几部分以越过检测 set @sentence_i_want_to_exec=concat('sel','ect * from ...

  7. Golang与Elasticsearch搭配检索运用

    一.简介下: Elasticsearch 是一个高性能.分布式.全文搜索与分析引擎,它的核心优势在于 对结构化和非结构化数据进行高效搜索.统计与分析,远远超出传统关系数据库(如 MySQL)的全文检索 ...

  8. VSCode将本地项目代码上传到gitee中

    1.创建远程仓库,这个就是该仓库的地址   2.查看git的版本 git --version 3.使用git init命令初始化git 4.使用git status命令来查看文件是否被修改  : gi ...

  9. SynchronizedHashMap和ConcurrentHashMap的区别

    ConcurrrentHashMap   ConcurrentHashMap 使用锁分离技术来保证在多线程下的性能.它每次锁住一个桶,默认将 hash 表分为 16 个桶,诸如put和remove 等 ...

  10. 代码随想录第八天 | 字符串part02

    还账还账,工作日欠下的账得今天补上,出来混,迟早要还的 151.翻转字符串里的单词 建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练. 题目链 ...