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

除此以外,wlmedia也是一款优秀的国产音视频播放SDK,该框架既支持Android系统,也支持鸿蒙系统,集成方便、使用简单,可谓异军突起。wlmedia基于FFmpeg、OpenSSL、SoundTouch、dav1d等第三方库,支持file、http、https、udp、rtmp、rtp、rtsp、byte[]等常见播放协议,也支持H.264、H.265、AV1等视频编码格式。

wlmedia的源码托管地址为https://github.com/ywl5320/wlmedia,最新版本是2025年4月发布的wlmedia 4.2.0,可见该框架的源码更新十分及时。并且wlmedia的源码采用Java+XML编写,对于初学者而言非常友好,使用Android Studio Dolphin(小海豚版本)无需任何改动即可直接导入wlmedia的demo工程。

在自己的App工程中集成wlmedia也很简单,只要执行下列几个步骤就行。

一、导入wlmedia库

如果已经事先导入wlmedia的库工程,则只需在build.gradle中添加下面一行即可引入wlmedia:

implementation project(path: ':wlmedia')

如果不用库工程,也只要在build.gradle中添加下面一行即可引入wlmedia:

implementation 'com.github.ywl5320:wlmedia:4.2.0'

二、引入wlmedia控件

wlmedia提供了两种控件:WlSurfaceView和WlTextureView,其中WlSurfaceView用于一般的播放场景,布局代码示例如下:

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="260dp">
    
    <-- WlSurfaceView 一般播放使用 -->
    <com.ywl5320.wlmedia.widget.WlSurfaceView
        android:id="@+id/wlsurfaceview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />     <-- WlSurfaceView 加载中的动画 -->
    <com.ywl5320.wlmedia.widget.WlCircleLoadView
        android:id="@+id/wlcircleview"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_centerInParent="true" />     <-- WlSurfaceView 播放控制条 -->
    <com.ywl5320.wlmedia.widget.WlSeekBar
        android:id="@+id/wlseekbar"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true" />
</RelativeLayout>

而WlTextureView用于需要变更展示效果的场景,比如透明、移动、旋转等等,布局代码示例如下:

<-- WlTextureView 需要做透明、移动、旋转等使用 -->
<com.ywl5320.wlmedia.widget.WlTextureView
    android:id="@+id/wltextureview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

三、引入wlmedia播放器

wlmedia提供的播放器叫做WlPlayer,它的用法很简单,只要以下几行代码就够了:

// 创建播放器WlPlayer的实例
WlPlayer wlPlayer = new WlPlayer();
// 设置使用OpenGL渲染的最大视频宽高
wlPlayer.setRenderDefaultSize(3840, 2160);
// 是否自动播放
wlPlayer.setAutoPlay(true);
// 设置音量
wlPlayer.setVolume(100);
WlSurfaceView wlSurfaceView = findViewById(R.id.wlsurfaceview);
// 让控件wlSurfaceView关联播放器WlPlayer
wlSurfaceView.setWlPlayer(wlPlayer);

按照上述几个步骤给App工程集成wlmedia后,编译运行wlmedia的demo工程,打开测试App如下图所示,可见wlmedia提供了多种演示功能。

点击第一个“基础播放”按钮,打开普通播放页面如下图所示,可见wlmedia除了常规的控制操作之外,还提供了缩放、倍速、截图等其他功能。

总结一下,wlmedia的确使用简单,播放功能也丰富,是个不错的国产播放器SDK。

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

FFmpeg开发笔记(七十六)使用国产SDK的播放器wlmedia渲染视频的更多相关文章

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

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

  2. .net开发笔记(十六) 对前部分文章的一些补充和总结

    补充有两个: 一个是系列(五)中讲到的事件编程(网址链接),该文提及到了事件编程的几种方式以及容易引起的一些异常,本文补充“多线程事件编程”这一块. 第二个是前三篇博客中提及到的“泵”结构在编程中的应 ...

  3. 安卓开发笔记(十六):'Request(okhttp3.Request.Builder)' has private access in 'okhttp3.Request

    当出现了'Request(okhttp3.Request.Builder)' has private access in 'okhttp3.Request的错误的时候,实际上是我们在写代码的时候少打了 ...

  4. Java开发笔记(十六)非此即彼的条件分支

    前面花了大量篇幅介绍布尔类型及相应的关系运算和逻辑运算,那可不仅仅是为了求真值或假值,更是为了通过布尔值控制流程的走向.在现实生活中,常常需要在岔路口抉择走去何方,往南还是往北,向东还是向西?在Jav ...

  5. Android笔记(七十六) 点菜DEMO

    一个朋友让看一下他的代码,一个点菜的功能,他和我一样,初学者,代码比我的都混乱,也是醉了,干脆想着自己写个demo给他看,原本想着听简单,半个小时应该就可以搞定,真正写的时候,画了3h+,汗颜... ...

  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. 浏览器如何确定最终的CSS属性值?解析计算优先级与规则

    前言 上篇文章中有提到CSS值的处理过程,但如果想要确定一个元素的最终样式值可以不需要这么多步.实际上我们写的任何一个标签元素无论写没写样式,它都会有一套完整的样式.理解这一点非常重要️ 比如:一个简 ...

  2. 『Plotly实战指南』--交互功能进阶篇

    在数据可视化的世界中,交互性是提升用户体验和数据探索效率的关键.从简单的悬停提示到复杂的动态数据更新,交互功能让静态图表变得生动起来. 本文将介绍Plotly的高级交互功能,包括点击事件处理.动态数据 ...

  3. termux安装vim

    pkg install vim 解决乱码问题 在家⽬录( ~ )下,新建 .vimrc ⽂件 vim .vimrc 添加内容如下: set fileencodings=utf-8,gb2312,gb1 ...

  4. K8s新手系列之Secret资源

    概述 官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/ 在Kubernetes(k8s)中,Secret是一种用 ...

  5. 遇到的问题之“Parameter 'item' not found. ”

    一.问题 Parameter 'item' not found. 参数item找不到 二.原因 这里的值没有写对,#{item}的item应是改为productSku,改后就不会报错了 三.解决方案 ...

  6. TypeScript实用技巧大杂烩,助你成为真正的全栈工程师

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  7. 深度解析JS事件驱动模型:如何理解浏览器中的异步回调和事件循环

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  8. C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)

    C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:static_cast.reinterpret_cast.const_cast和dynamic_cast,当然C++为保持与C的兼容, ...

  9. C# 基础问题汇集

    (1)new List并不是null,可以正常的被遍历和AddRange class Program { public static void Main() { //var t = new test( ...

  10. .NET 原生驾驭 AI 新基建实战系列(八):总结篇 ── 数据库技术的革命:从结构化到非结构化再到智能化的演进

    引言 随着信息技术的飞速发展,数据库技术作为数据管理与存储的核心支柱,经历了从结构化到非结构化,再到如今智能化的深刻变革.每一次技术革新都不仅是对数据处理能力的提升,更是对人类利用数据方式的重新定义. ...