测试C#调用Aplayer播放视频(3:编写简易播放器)

news2025/7/27 21:59:14

  学习了参考文献1中的示例代码,也找出了前一篇文章中自己测试控件但无法播放视频的问题(没有将解码库文件复制到可执行程序所在的codecs文件夹内),本文基于APlayer组件编写简单的视频播放器,主要实现以下功能:

序号功能说明
1自定义logo调用SetCustomLogo函数设置未播放视频时的显示图片,图片来自参考文献2
2打开文件调用Open函数打开并播放视频文件
3定时刷新播放信息参照参考文献1中的demo,使用定时器定时刷新当前播放进度,调用GetDuration获取视频总时长,调用GetPosition获取当前播放时间,同时在OnOpenSucceeded中启动定时器,在OnStateChanged事件中停止定时器
4暂停/播放/停止调用Pause/Play/Close函数暂停/播放/停止视频
5设置音量调用SetVolume设置音量,尽在0-100范围内调节音量,并未使用APlayer的10倍放大
6拖拽时间条调用SetPosition函数在Trackbar的Scroll事件中重新设置播放时间
7快进/快退调用SetPosition函数快进/快退10秒

  最后是程序界面、播放视频截图及主要代码:
在这里插入图片描述在这里插入图片描述

public Form1()
{
   this.axPlayer1.SetCustomLogo(((Bitmap)Bitmap.FromFile("gundam.jpg")).GetHbitmap().ToInt32());
   axPlayer1.OnOpenSucceeded += new EventHandler(OnOpenSucceeded);
   axPlayer1.OnStateChanged += new _IPlayerEvents_OnStateChangedEventHandler(OnStateChanged);
}

string TimeToString(TimeSpan span)
{
   return span.Hours.ToString("00") + ":" +
   span.Minutes.ToString("00") + ":" +
   span.Seconds.ToString("00");
}

void OnOpenSucceeded(object sender, EventArgs e)
{
   lblProgress.Text= "00:00:00/"+TimeToString(TimeSpan.FromMilliseconds(axPlayer1.GetDuration()));            
   tbTimeline.Maximum = axPlayer1.GetDuration();
   timer1.Start();
}

private void UpdatePlayInfo(object sender, EventArgs e)
{
   lblProgress.Text = TimeToString(TimeSpan.FromMilliseconds(axPlayer1.GetPosition()))+"/" + TimeToString(TimeSpan.FromMilliseconds(axPlayer1.GetDuration()));
   tbTimeline.Value = axPlayer1.GetPosition() < 0 ? 0 : axPlayer1.GetPosition();
}

private void tbVolumn_ValueChanged(object sender, EventArgs e)
{
   axPlayer1.SetVolume(tbVolumn.Value);
}

private void btnForward_Click(object sender, EventArgs e)
{
   axPlayer1.SetPosition(axPlayer1.GetPosition() + 10000);
}

private void btnBack_Click(object sender, EventArgs e)
{
   int timeLine = axPlayer1.GetPosition() - 10000;
   axPlayer1.SetPosition(timeLine < 0 ? 0 : timeLine);
}

private void btnClose_Click(object sender, EventArgs e)
{
   axPlayer1.Close();
}

private void btnPlay_Click(object sender, EventArgs e)
{
   axPlayer1.Play();
}

private void btnPause_Click(object sender, EventArgs e)
{
   axPlayer1.Pause();
}

void OnStateChanged(object sender, _IPlayerEvents_OnStateChangedEvent e)
{
   switch (e.nNewState)
   {
       case 0:
           tbTimeline.Value = 0;
           lblProgress.Text = "00:00:00/00:00:00" ;   
           timer1.Stop();
           break;                
   }
}

private void btnOpen_Click(object sender, EventArgs e)
{
   using (OpenFileDialog ofd = new OpenFileDialog())
   {
       ofd.Filter = "mp4|*.mp4|avi|*.avi|rm|*.rm|rmvb|*.rmvb|flv|*.flv|xr|*.xr|所有文件|*.*";
       ofd.Multiselect = false;
       if (ofd.ShowDialog() == DialogResult.OK)
       {
           axPlayer1.Open(ofd.FileName);
       }
   }
}

private void tbTimeline_Scroll(object sender, EventArgs e)
{
   axPlayer1.SetPosition(tbTimeline.Value);
   lblProgress.Text = TimeToString(TimeSpan.FromMilliseconds(axPlayer1.GetPosition())) + "/" + TimeToString(TimeSpan.FromMilliseconds(axPlayer1.GetDuration()));
}

参考文献:
[1]https://blog.csdn.net/qq_45533937/article/details/115800927
[2]https://www.hpoi.net/hobby/10836

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS实现弹簧放大动画

效果图 实现代码 - (void)setUpContraints {CGFloat topImageCentery (SCREEN_HEIGHT - 370 * PLUS_SCALE) / 2;[self.topIconView mas_makeConstraints:^(MASConstraintMaker *make) {make.centerX.mas_equalTo(0);make.centerY.equalTo(self.view.mas_top).with.offset(t…

一定要看看的大模型【评测基准】及【评测报告】

评测标准 1.能力基础评测 为了检验大语言模型(LLM)的有效性和优越性,已有研究采用了大量的任务和基准数据集来进行实证评估和分析。根据任务定义,现有语言生成的任务主要可以分为语言建模、条件文本生成和代码合成任务。需要注意的是,代码合成不是典型的自然语言处理任务…

Qt6:子窗口向父窗口传值

终于解决了这个问题&#xff01;这才怀着激动的心情跑来记录一下。你们是不知道这其中的艰辛啊&#xff0c;太难了&#xff0c;差亿点就放弃学Qt了…… 此处苦水省略一万字…… 关于子窗口向父窗口传值的方法&#xff0c;在网上搜了不下百遍&#xff0c;免费的、付费下载、会员…

STM智能小车——OLED实现测速小车

目录 1. 测速模块 2. 测试原理和单位换算 3. 定时器和中断实现测速开发和调试代码 4. 小车速度显示在OLED屏 1. 测速模块 用途&#xff1a;广泛用于电机转速检测&#xff0c;脉冲计数,位置限位等。有遮挡&#xff0c;输出高电平&#xff1b;无遮挡&#xff0c;输出低电平接线…

0基础学习VR全景平台篇第115篇:转换为立方体面 - PTGui Pro教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01;PTGui的软件教程到了这节课即将结束&#xff0c;我们此前历数各种编辑、优化全景的方法步骤&#xff0c;相信可以带给大家一些帮助。可是因为一些人力不可抗拒因素&#xff0c;造成…

SSM校园设备管信息管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

选题理由 随着计算机网络及多媒体技术的广泛应用&#xff0c;互联网已成为高校办学的基础设施和必备条件&#xff0c;基于互联网的高校信息管理越来越综合化&#xff0c;越来越多的教学管理、行政管理工作将架构在互联网上&#xff0c;互联网正在变为学校实施教学、科研和管理…

图数据库Neo4j概念、应用场景、安装及CQL的使用

一、图数据库概念 引用Seth Godin的说法&#xff0c;企业需要摒弃仅仅收集数据点的做法&#xff0c;开始着手建立数据之间的关联关系。数据点之间的关系甚至比单个点本身更为重要。 传统的**关系数据库管理系统(RDBMS)**并不擅长处理数据之间的关系&#xff0c;那些表状数据模…

python爬取csdn的文章内容

今天写了一个爬取csdn文章的 初学不太会&#xff0c;下面代码有时间可以自行优化 新建python文件&#xff0c;把我的代码复制进去保存 把依赖python install 一下 import re import urllib.error import urllib.request import os import tkinter as tk from bs4 import Bea…

2023年Zotero最新同步教程-使用TeraCloud的25G免费空间实时跨设备同步文献

文章目录 1. 前言2.1. 注册账号2.1.1. 填写注册信息2.1.2. 创建账号成功2.1.3. 注意2.2. 扩容空间2.3. 打开WebDAV 3. Zotero配置WebDAV同步3.1. 设置网址3.2. 验证服务器3.3. 文件同步成功 4. 结语 1. 前言 Zotero免费版的存储空间是300m&#xff0c;一个图文PDF动辄两三M&am…

基于JAYA算法的无人机航迹规划-附代码

基于JAYA算法的无人机航迹规划 文章目录 基于JAYA算法的无人机航迹规划1.JAYA搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用JAYA算法来优化无人机航迹规划。 1.JAYA搜索算法 …

高效学习工具之AnkiMobile新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、设置参数、相关资料

文章目录 0 背景0.1 闭环学习0.2 什么是anki 1 开始使用1.1 导入1.2 创建空白组1.3 创建卡片1.3.1 利用anki创建卡片的两种方法1.3.2 复习材料分类 1.4 筛选&#xff08;做减法&#xff0c;拆分学习&#xff08;做子卡牌集合&#xff09;&#xff09;&#xff08;核心&#xff…

集简云slack(自建)无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

slack是一个工作效率管理平台&#xff0c;让每个人都能够使用无代码自动化和 AI 功能&#xff0c;还可以无缝连接搜索和知识共享&#xff0c;并确保团队保持联系和参与。在世界各地&#xff0c;Slack 不仅受到公司的信任&#xff0c;同时也是人们偏好使用的平台。 官网&#x…

3.12每日一题(有理函数不定积分)

两种方法&#xff1a; 1、拆项&#xff0c;然后分别加项减项拆&#xff0c;把分母降幂 注&#xff1a; x凑x的平方时前面要乘1/2 分子为x的平方可以分一个x去凑x的平方 2、联想三角有理函数公式&#xff0c;使用三角函数求解 用tant替换x&#xff1b;再通过二倍角公式降幂即可 …

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目

自定义的卷积神经网络模型CNN&#xff0c;对图片进行分类并使用图片进行测试模型-适合入门&#xff0c;从模型到训练再到测试&#xff1a;开源项目 开源项目完整代码及基础教程&#xff1a; https://mbd.pub/o/bread/ZZWclp5x CNN模型&#xff1a; 1.导入必要的库和模块&…

大模型时代的人工智能+大数据平台,加速创新涌现

大模型和MaaS概念的出现&#xff0c;定义了以模型为中心的一整套AI开发新范式&#xff0c;而这背后日益增长的巨大算力需求&#xff0c;对AI工程底座提出了新的挑战。今天&#xff0c;大模型时代下的人工智能大数据平台&#xff0c;需要具备计算效率、开发效率、处理效率为一体…

Java日志组件介绍之二

一、前言 Java日志组件介绍之一 主要介绍了JDK内置日志和Apache的common-logging通用日志接口&#xff0c;今天这篇我们继续了解Java其它一些日志组件。 二、slf4j slf4j即Simple Logging Facade for JAVA &#xff0c;简单日志门面&#xff0c;类似common-logging&#xff0…

RBAC:基于角色的访问控制

1.介绍 RBAC是一种库表设计思想 基于角色的访问控制&#xff08;RBAC&#xff09;是实施面向企业安全策略的一种有效的访问控制方式。一种数据库的设计思想&#xff0c;其核心是角色。其基本思想是&#xff0c;对系统操作的各种权限不是直接授予具体的用户&#xff0c;而是在…

element表格自定义筛选

文章目录 前言一、简介二、效果展示三、源码总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; …待续 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、简介 修改el-table的筛选…待续 二、效果展示 三、源码 使用方法…

视频汇聚平台EasyCVR分发的流如何进行token鉴权?具体步骤是什么?

视频监控EasyCVR平台能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能支持视…

喜报!CACTER邮件安全网关荣获2023鲲鹏应用创新大赛广东赛区三等奖

近期&#xff0c;2023鲲鹏应用创新大赛广东赛区暨广东省信息技术应用创新产业联盟创新大赛圆满落幕&#xff0c;Coremail凭借“基于鲲鹏CPU的邮件网关一体机解决方案”&#xff0c;荣获“金融行业方向”三等奖。 ​ 鲲鹏凌粤 展翅湾区 本届大赛广东区域赛以“鲲鹏凌粤 展翅湾…