当前位置: 首页 > news >正文

测试C#调用Aplayer播放视频(2:VideoPlayer源码学习)

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

在这里插入图片描述
  上述界面,基本都采用的基于Aplayer控件构建播放界面的技术路线,支持打开本地视频、在线视频(试了输入B网的视频地址,打不开,不清楚是不是视频地址格式不对造成的)、音量调节、播放/暂停/停止等功能,程序都不算复杂。
  项目中主要调用APlayer控件的以下主要函数:

序号名称说明
1SetVolume设置播放音量,取值范围为 0 - 1000
2SetCustomLogo设置视频区域在未播放视频时显示的图片
3GetDuration获取视频时长,单位为毫秒
4Open打开并播放视频文件,可以是本地或局域网或网络文件、DVD光碟、USB摄像头、屏幕或另一窗口截图 , Open 函数是一个异步方法, 调用后立即返回, 调用者想要知道 APlayer 是否真正成功地打开了媒体文件, 需要等后续的事件回调,如果打开成功,调用者会收到 OnOpenSucceeded 事件,如果打开失败,APlayer 的播放状态会变成 PS_READY 状态
5GetState获取播放引擎当前状态,返回值在下面的PLAY_STATE中定义
6Pause暂停视频
7Play继续播放视频
8Close关闭视频
9SetPosition设置视频播放位置,单位为毫秒,会触发OnSeekCompleted 事件
10GetPosition获取视频播放位置,单位为毫秒
11SetConfig设置播放参数,参数详细说明见APlayerSDK帮助文档中的APlayer设置

  项目中主要处理APlayer控件的以下几类事件:

序号名称说明
1OnBuffer播放在线视频,从网络缓冲媒体数据过程中触发,能够从事件中获取到缓冲百分比,100%时即可播放
2OnStateChanged迅雷播放引擎状态变化时触发,一般在播放、暂停、停止时触发,详细的状态说明见下面的枚举定义
3OnSeekCompleted跳转到指定位置时播放,主要是调用SetPosition函数设置播放位置后触发,能在事件中获取到最新的播放位置
4OnOpenSucceeded成功打开视频文件时触发,根据帮助文档,在此事件中可以做一些播放前的初始化工作
5OnDownloadCodec播放视频文件缺少对应的解码器时触发,能在事件中获取缺少的解码器的全路径,可以通过程序同步或异步下载解码器文件
6OnMessage视频区域操作鼠标或者视频区域拥有焦点时操作键盘时触发,两个小项目中都在此事件中处理鼠标操作,包括左键、右键、双击等
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

http://www.lryc.cn/news/214414.html

相关文章:

  • YOLOv5 分类模型的预处理
  • 25 行为型模式-备忘录模式
  • 物联网AI MicroPython传感器学习 之 SHT3X温湿度传感器
  • int* p = new int[5]; int *p = new int[5]();delete[] p; delete p;区别是什么?
  • 数据结构|基础知识定义
  • 物联网AI MicroPython传感器学习 之 MFRC522 RFID射频IC卡感应模块
  • 搭建ES集群
  • Tomcat的日志接收文件catalina.out nohup.out说明
  • 手机ip地址切换后有什么影响
  • C++ 赋值运算重载,const成员,取地址及const取地址操作符重载
  • 嵌入式Linux系统的闪存设备和文件系统学习纪要
  • android 8.1 disable unsupported sensor
  • 二、类与对象(一)
  • 写给所有的程序员,或者努力生活的你。
  • pytorch 笔记:GRU
  • Kubernetes - Ingress HTTP 升级 HTTPS 配置解决方案(新版本v1.21+)
  • Verilog:写流水灯时遇到的问题
  • 操作系统第四章-存储器管理
  • org.springframework.cloud:spring-cloud-starter-openfeign:jar is missing详解
  • Netty第一部
  • 【设计模式】第11节:结构型模式之“装饰器模式”
  • Spire.doc读取模板文档,并在书签处插入内容
  • 性能测试实施流程,5个阶段给老板安排的明明白白!
  • 【教程】R语言生物群落(生态)数据统计分析与绘图
  • 数据库-用户权限管理
  • 十一、W5100S/W5500+RP2040树莓派Pico<ARP 地址解析>
  • 可以直接在线制作电子画册的网站
  • SortableJS:vuedraggable实现元素拖放排序
  • 跟着Nature Communications学作图:纹理柱状图+添加显著性标签!
  • 88. 合并两个有序数组、Leetcode的Python实现