测试C#调用Aplayer播放视频(2:VideoPlayer源码学习)
参考文献1除了介绍Aplayer组件的用法之外,还提供有demo下载以供学习,本文学习并记录其中的使用方式。
VideoPlayer项目使用C#在VS2013开发,其解决方案中包括VideoPlayer和VideoPlayer两个小项目,前者基于.net framework4.0,后者基于.net framework3.5,这两个项目的程序截图如下所示:

上述界面,基本都采用的基于Aplayer控件构建播放界面的技术路线,支持打开本地视频、在线视频(试了输入B网的视频地址,打不开,不清楚是不是视频地址格式不对造成的)、音量调节、播放/暂停/停止等功能,程序都不算复杂。
项目中主要调用APlayer控件的以下主要函数:
| 序号 | 名称 | 说明 |
|---|---|---|
| 1 | SetVolume | 设置播放音量,取值范围为 0 - 1000 |
| 2 | SetCustomLogo | 设置视频区域在未播放视频时显示的图片 |
| 3 | GetDuration | 获取视频时长,单位为毫秒 |
| 4 | Open | 打开并播放视频文件,可以是本地或局域网或网络文件、DVD光碟、USB摄像头、屏幕或另一窗口截图 , Open 函数是一个异步方法, 调用后立即返回, 调用者想要知道 APlayer 是否真正成功地打开了媒体文件, 需要等后续的事件回调,如果打开成功,调用者会收到 OnOpenSucceeded 事件,如果打开失败,APlayer 的播放状态会变成 PS_READY 状态 |
| 5 | GetState | 获取播放引擎当前状态,返回值在下面的PLAY_STATE中定义 |
| 6 | Pause | 暂停视频 |
| 7 | Play | 继续播放视频 |
| 8 | Close | 关闭视频 |
| 9 | SetPosition | 设置视频播放位置,单位为毫秒,会触发OnSeekCompleted 事件 |
| 10 | GetPosition | 获取视频播放位置,单位为毫秒 |
| 11 | SetConfig | 设置播放参数,参数详细说明见APlayerSDK帮助文档中的APlayer设置 |
项目中主要处理APlayer控件的以下几类事件:
| 序号 | 名称 | 说明 |
|---|---|---|
| 1 | OnBuffer | 播放在线视频,从网络缓冲媒体数据过程中触发,能够从事件中获取到缓冲百分比,100%时即可播放 |
| 2 | OnStateChanged | 迅雷播放引擎状态变化时触发,一般在播放、暂停、停止时触发,详细的状态说明见下面的枚举定义 |
| 3 | OnSeekCompleted | 跳转到指定位置时播放,主要是调用SetPosition函数设置播放位置后触发,能在事件中获取到最新的播放位置 |
| 4 | OnOpenSucceeded | 成功打开视频文件时触发,根据帮助文档,在此事件中可以做一些播放前的初始化工作 |
| 5 | OnDownloadCodec | 播放视频文件缺少对应的解码器时触发,能在事件中获取缺少的解码器的全路径,可以通过程序同步或异步下载解码器文件 |
| 6 | OnMessage | 视频区域操作鼠标或者视频区域拥有焦点时操作键盘时触发,两个小项目中都在此事件中处理鼠标操作,包括左键、右键、双击等 |
enum PLAY_STATE
{PS_READY = 0, // 准备就绪PS_OPENING = 1, // 正在打开PS_PAUSING = 2, // 正在暂停PS_PAUSED = 3, // 暂停中PS_PLAYING = 4, // 正在开始播放PS_PLAY = 5, // 播放中PS_CLOSING = 6, // 正在开始关闭
};
项目编译完成后,会在可执行文件所在目录下创建codecs,需要手动将解码器文件复制到该文件夹内才可正常播放视频,上一篇文章中最后提到的问题就是没有复制解码器文件造成的(也可以调用SetConfig函数通过Codecs path参数设置解码器文件路径),后续会参照本文学习的源码编写简单的视频播放程序。
参考文献:
[1]https://blog.csdn.net/qq_45533937/article/details/115800927
相关文章:
测试C#调用Aplayer播放视频(2:VideoPlayer源码学习)
参考文献1除了介绍Aplayer组件的用法之外,还提供有demo下载以供学习,本文学习并记录其中的使用方式。 VideoPlayer项目使用C#在VS2013开发,其解决方案中包括VideoPlayer和VideoPlayer两个小项目,前者基于.net framework4.0&am…...
YOLOv5 分类模型的预处理
YOLOv5 分类模型的预处理 flyfish 版本 6.2 将整个代码简化成如下代码 imgsz224 file "/home/a/Pictures/1.jpg" transforms classify_transforms(imgsz) im cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB) print(im.shape)im transforms(im) print(im.…...
25 行为型模式-备忘录模式
1 备忘录模式介绍 备忘录模式(memento pattern)定义: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 2 备忘录模式原理 3 备忘录模式实现 /*** 发起人角色**/ public class Originator {private Strin…...
物联网AI MicroPython传感器学习 之 SHT3X温湿度传感器
学物联网,来万物简单IoT物联网!! 一、产品简介 Sensirion SHT3x-DIS湿度和温度传感器基于CMOSens传感器芯片,更加智能、可靠,精度更高。SHT3x-DIS具有增强的信号处理能力、两个独特的用户可选I2C地址,通信…...
int* p = new int[5]; int *p = new int[5]();delete[] p; delete p;区别是什么?
int main() {int *p new int[5]; // 分配包含5个整数的数组内存// 初始化数组元素for (int i 0; i < 5; i) {p[i] i * 10;}// 试图使用 delete p; 来释放数组内存delete p;delete[] p;// 打印数组元素for (int i 0; i < 5; i) {std::cout << "p[" &l…...
数据结构|基础知识定义
1.值传递、地址传递、值返回、地址返回 1> 值传递:普通变量作为函数参数传递是单向的值传递,只是将实参的值复制一份给形参变量,形参的改变不会影响实参的值,因为所在内存空间不同 如果传递的是地址,被调函数使用指…...
物联网AI MicroPython传感器学习 之 MFRC522 RFID射频IC卡感应模块
学物联网,来万物简单IoT物联网!! 一、产品简介 MFRC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,其特点低电压、低成本、体积小的非接触式读写芯片。MFRC522支持MIFARE系列更高速的非接触式通信,双向数据…...
搭建ES集群
目录 前言 搭建ES集群 集群状态监控 分片备份 节点角色 脑裂问题 分布式存储 分布式查询 故障转移 前言 单机的ES做数据存储必然会面临两个问题:海量数据存储问题、单机故障问题 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&…...
Tomcat的日志接收文件catalina.out nohup.out说明
catalina.out用于接收如下情况的日志: catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stderr会重定向到这里。所以我们在应用里使用System.out打印的东西都会到这…...
手机ip地址切换后有什么影响
随着互联网的普及和人们对网络连接的需求不断增加,手机已经成为我们日常生活中不可或缺的一部分。而在使用手机的过程中,手机ip地址的切换也成为了许多用户需要注意的问题。虎观代理小二二将探讨手机ip地址切换后可能产生的影响。 手机ip地址的含义及作…...
C++ 赋值运算重载,const成员,取地址及const取地址操作符重载
C 赋值运算重载,const成员,取地址及const取地址操作符重载 1. 赋值运算符重载1.1 运算符重载1.2 赋值运算符重载1.3 前置/--和后置/--重载 2. const成员3. 取地址及const取地址操作符重载 所属专栏:C“嘎嘎" 系统学习❤️ 🚀…...
嵌入式Linux系统的闪存设备和文件系统学习纪要
嵌入式Linux系统的闪存设备和文件系统学习纪要 Linux下的文件系统结构如下: NAND Flash 是一种非易失性存储器(Non-Volatile Memory),常用于闪存设备和固态硬盘(SSD)中。以下是几种常见的 NAND Flash 种类&…...
android 8.1 disable unsupported sensor
如果device不支持某种sensor,可以在android/frameworks/base/core/java/android/hardware/SystemSensorManager.java里将其disabled掉。以disable proximity sensor为例。 public SystemSensorManager(Context context, Looper mainLooper) {synchronized(sLock) {if (!sNativ…...
二、类与对象(一)
1 面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。以洗衣服为例,通常洗衣服会经历以下过程: 而C是基于面向对象的,关注的是对象,…...
写给所有的程序员,或者努力生活的你。
朋友们,好好休息,意味着好好锻炼,好好睡觉,好好学习,学习可以是功利的,需要有规划的,有执行能力,有反馈奖励机制的,也可以无用之用方为大用(比如take shit的时…...
pytorch 笔记:GRU
1 介绍 对于输入序列中的每个元素,每一层都计算以下函数: ht 是t时刻 的隐藏状态xt 是t时刻 的输入ht−1 是 t-1时刻 同层的隐藏状态或 0时刻 的初始隐藏状态rt,zt,nt 分别是重置门、更新门和新门。σ 是 sigmoid 函数∗ 是 Hadamard 乘积。…...
Kubernetes - Ingress HTTP 升级 HTTPS 配置解决方案(新版本v1.21+)
之前我们讲解过 Kubernetes - Ingress HTTP 搭建解决方案,并分别提供了旧版本和新版本。如果连 HTTP 都没搞明白的可以先去过一下这两篇 Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客Kubernetes - Ingress HTTP 负载搭建部署解决方案…...
Verilog:写流水灯时遇到的问题
module flow_led(input sys_clk, //系统时钟50Mhz 周期0.02nsinput sys_rst_n, //系统异步复位,低电平有效output reg [3:0] led ); reg [24:0] cnt;//计数器计时0.5s250000000*0.02ns always(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt <…...
操作系统第四章-存储器管理
4.1 内存的基本知识 4.1.1 逻辑地址和物理地址 逻辑地址又称为相对地址 物理地址又称为绝对地址 一. 逻辑地址 内存中有多个进程,相对地址是相对于进程的起始地址而言的地址. 二.物理地址 绝对地址是在整个内存下的地址 4.2 程序的装入和链接 引入:用户程序要在系统中运…...
org.springframework.cloud:spring-cloud-starter-openfeign:jar is missing详解
openfeign无法导入的问题 我感觉最近带的好几个新人在搭建springCloud基础框架的时候,会犯一个非常小的错误,导致进度卡住了。 这个错误就是Feign导入的错误: ‘dependencies.dependency.version’ for org.springframework.cloud:spring-c…...
亿万富翁不再相信比特币
亿万富翁首次公开称不再相信比特币的「数字黄金」叙事。对比特币而言,或许是一个重要转折点。5月22日,亿万富翁投资者马克库班表示, 在对比特币作为抵御法币疲软和地缘政治不稳定对冲工具的作用失去信心后, 他已经卖掉大部分比特币持仓。净资产约为100亿…...
告别AssetBundle手动管理:Unity Addressables保姆级配置与本地服务器搭建实战
Unity Addressables全流程实战:从资源管理到热更新闭环如果你曾经被AssetBundle的依赖关系折磨得焦头烂额,或者为资源热更新方案纠结不已,那么Addressables可能就是你在寻找的解决方案。这套由Unity官方推出的资源管理系统,不仅保…...
基于Arduino与ADXL335的自制地震预警系统:从传感器原理到多点联动实现
1. 项目概述与核心思路最近在捣鼓一个挺有意思的玩意儿——一个能自主工作的地震预警系统。这可不是什么高深莫测的科研项目,而是基于一些常见的电子模块,自己动手就能搭建起来的实用装置。它的核心目标很明确:当检测到建筑物出现异常振动时&…...
Spring Boot项目里,我是怎么把文心一言API集成进去的(附完整代码)
Spring Boot项目中集成文心一言API的实战指南 最近在开发一个需要AI对话功能的Spring Boot应用时,我选择了百度的文心一言作为后端引擎。整个过程从申请API权限到最终实现流式响应,踩了不少坑也积累了一些经验。本文将分享如何在Spring Boot项目中优雅地…...
Cocos Creator资源加载优化:用AssetManager的preload和loadBundle提升游戏首屏速度
Cocos Creator资源加载优化:用AssetManager的preload和loadBundle提升游戏首屏速度当玩家首次打开你的游戏时,那几秒钟的等待时间可能决定了他们是否会继续玩下去。作为一款成熟的游戏引擎,Cocos Creator提供了强大的AssetManager系统来管理资…...
基于Transformer的行星大气辐射传输仿真器:百倍加速与1%精度
1. 项目概述:用Transformer重塑行星大气辐射传输计算在行星科学和天体物理领域,模拟一颗行星的大气层如何吸收、散射和发射星光与热辐射,是理解其气候、演化乃至潜在宜居性的基石。这个过程的核心,就是辐射传输计算。无论是预测即…...
机器学习破解等离子体模拟维度灾难:储层计算实现Vlasov方程高效闭合
1. 项目概述与核心挑战在等离子体物理和计算流体动力学领域,有一个长期困扰研究者和工程师的“幽灵”问题:闭合问题。简单来说,我们试图用计算机里有限的、离散的网格点,去描述一个本质上连续、甚至无限维度的物理世界。比如&…...
从技术配置角度拆解全屋定制:五金件选型对柜体长期稳定性的影响
装修做全屋定制,大部分人的关注点集中在板材的环保等级和封边工艺上。但在日常使用中,决定一套柜子用起来顺不顺滑、耐不耐用的关键因素,还有一项容易被忽略——五金件的选型与安装精度。作为一个习惯把东西拆开研究明白的人,这次…...
机器学习原子势能建模:深度集成与贝叶斯神经网络的不确定性估计对比
1. 项目概述与核心问题在材料科学和计算化学领域,机器学习原子间势能模型已经从一个前沿概念,变成了加速新材料发现和深入理解物质行为的核心工具。简单来说,它就像一个“超级拟合器”,通过学习大量已知的原子构型及其对应的能量和…...
Unity热更新实战:YooAsset与HybridCLR协同落地指南
1. 这不是“加个插件就能热更”的童话,而是Unity项目里最真实的代码热更新落地现场在Unity游戏开发中,“热更新”三个字背后藏着太多被轻描淡写的代价:策划说“今天上线新活动,明天要热更”,程序却在凌晨三点对着Asset…...
