【正点原子K210连载】第三十一章 视频播放实验 摘自【正点原子】DNK210使用指南-CanMV版指南

news2024/9/22 15:28:59

1)实验平台:正点原子ATK-DNK210开发板
2)平台购买地址https://detail.tmall.com/item.htm?id=731866264428
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第三十一章 视频播放实验

本章将介绍CanMV下的视频播放,通过CanMV提供的模块便能快速实现视频播放。通过本章的学习,读者将学习到CanMV下video模块的使用。
本章分为如下几个小节:
31.1 video模块介绍
31.2 硬件设计
31.3 程序设计
31.4 运行验证

31.1 video模块介绍
video模块时CanMV内置的模块,video模块用于视频的播放,video模块可以对指定文件系统路径的视频文件进行音视频解码,然后将其音频通过I2S接口进行输出,视频数据则解码后通过LCD进行显示。
video模块为Video对象提供了open()方法,用于打开一个文件系统中的视频文件,来进行视频的播放,并返回一个Video对象,open()方法如下所示:
video.open(path, record=False, interval=100000, quality=50, width=320, height=240, audio=False, sample_rate=44100, channels=1)
open()方法用于打开一个文件系统中的视频文件,来进行视频播放或录制,同时返回一个Video对象,仅支持AVI格式的视频文件。
path指的是视频文件在文件系统中的路径。
record指的是是否进行视频录制,当为False时,进行视频播放,当为True时,则进行视频录制。
interval指的是视频录制的帧间隔,单位为微秒。
quality指的是视频录制时图像数据的压缩质量,范围为[1, 100]。
width指的是视频录制的图像宽度。
height指的是视频录制的图像高度。
audio指的是视频录制时是否录制音频,当为False时,则不录制音频,反之为True时,则录制音频。
sample_rate指的是当录制视频且录制音频时,录制音频的采样率。
channels指的时方录制视频且录制音频时,录制音频的声道数。
open()函数的使用示例如下所示:

import video

video_player = video.open("/sd/VIDEO/play.avi")

video模块为Video对象提供了volume()方法,用于配置播放音频时的音量,volume()方法如下所示:
video.volume(volume)
volume()方法用于配置播放音频时的音量。
volume指的是配置的音量,范围为[0, 100]。
volume()方法的使用示例如下所示:

import video

video_player = video.open("/sd/VIDEO/play.avi")
video_player.volume(30)

video模块为Video对象提供了play()方法,用于读取视频文件并解析播放,play()方法如下所示:
video.play()
play()方法用于读取视频文件并解析播放,每次执行play()函数会读取并解析播放一小段视频文件,因此play()函数需要配合循环使用。
play()方法的使用示例如下所示:

import video

video_player = video.open("/sd/VIDEO/play.avi")

while video_player.play():
    pass

需要特别注意的时,使用video模块播放视频文件的时,I2S0 Channel0、DMAC Channel4将会被系统占用,并且在使用video模块播放视频文件前,需要对I2S0 Channel0进行配置。
31.2 硬件设计
31.2.1 例程功能

  1. 使用video模块播放CanMV文件系统中指定的视频文件,图像通过LCD进行显示,音频通过板载扬声器进行播放。
    31.2.2 硬件资源
  2. LCD
    LCD_RD - IO34
    LCD_BL - IO35
    LCD_CS - IO36
    LCD_RST - IO37
    LCD_RS - IO38
    LCD_WR - IO39
    LCD_D0~LCD_D7 - SPI0_D0~SPI0_D7
  3. 数字功放NS4168
    SPK_CTRL - IO21
    IIS_SDOUT - IO31
    IIS_BCK - IO32
    IIS_LRCK - IO33
    31.2.3 原理图
    本章实验内容,主要讲解video模块的使用,无需关注原理图。
    31.3 程序设计
    31.3.1 video模块介绍
    有关video模块的介绍,请见第31.1小节《video模块介绍》。
    31.3.2 程序流程图
    在这里插入图片描述

图31.3.2.1 视频播放实验流程图
31.3.3 main.py代码
main.py中的脚本代码如下所示:

from board import board_info
from fpioa_manager import fm
from maix import GPIO
from maix import I2S
import lcd
import video

lcd.init()

fm.register(board_info.SPK_CTRL, fm.fpioa.GPIO0)
fm.register(board_info.SPK_WS, fm.fpioa.I2S0_WS)
fm.register(board_info.SPK_SCLK, fm.fpioa.I2S0_SCLK)
fm.register(board_info.SPK_SDOUT, fm.fpioa.I2S0_OUT_D0)

spk_ctl = GPIO(GPIO.GPIO0, GPIO.OUT)
spk_ctl.value(1)

i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT, cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)

# 构造Vedio对象并配置音频播放音量
video_player = video.open("/sd/VIDEO/play.avi")
video_player.volume(30)

# 循环播放视频
while video_player.play():
    pass

# 结束视频播放
video_player.__del__()

可以看到首先初始化了LCD并为GPIO以及I2S分配IO,然后控制数字功放NS4168的CTRL引脚为高电平,此时NS4168被配置为控制扬声器播放音频数据中的右声道音频。
接着是构造了一个I2S对象,并配置了I2S对应的通道为发送模式,因为本实验需要播放视频中的音频数据。
再接着构造了一个Video对象,Video对象与文件系统中的视频文件进行绑定,然后配置了音频播放的音量。
然后就是循环播放视频数据了,如果都没有问题的话,此时应该能在LCD上观察到视频画面,并听见DNK210开发板板载的扬声器发声了。
最后在视频文件播放完毕后,结束视频播放,释放视频播放占用的资源。
31.4 运行验证
将DNK210开发板连接CanMV IDE,同时将实验例程目录下的play.avi视频文件放入SD卡根目录下的media文件夹下后,点击CanMV IDE上的“开始(运行脚本)”按钮后,可以听到DNK210开发板板载的扬声器播放了play.avi视频文件中的音频,且LCD上显示了视频中的画面,如下图所示:
在这里插入图片描述

图31.4.1 LCD播放视频画面

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

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

相关文章

案例分析:多线程锁该如何优化?

我们在前面几篇中,了解到可以使用 ThreadLocal,来避免 SimpleDateFormat 在并发环境下引起的时间错乱问题。其实还有一种解决方式,就是通过对parse 方法进行加锁,也能保证日期处理类的正确运行 其实锁对性能的影响,是非…

.NET系列 定时器

net一共4种定时器 System.Windows.Forms.Timer 类型 》》WinForm专用System.Windows.Threading.DispatcherTime类型》》WPF专用System.Threading.Timer类型》》》它使用 ThreadPool 线程来执行定时操作System.Timers.Timer类型 》》这种很老了。 它使用基于底层计时…

leetcode刷题-动态规划part02

代码随想录动态规划part02|62.不同路径 、63.不同路径II 、343. 整数拆分、 62.不同路径63.不同路径 II343. 整数拆分 再看本题思路并不容易想,一刷建议可以跳过。如果学有余力,可以看视频理解一波。 96.不同的二叉搜索树 跳过 62.不同路径 leetcode题目…

Netty源码小窥探(一)

记录背景 最近在学习Netty,阅读了部分源码,记录一下笔记,方便自己回顾和也希望能作为初学的小伙伴们的部分参考。 本次Netty源码小窥探会是一个小合集,因为个人能力有限,介绍程度肯定不会太深奥,个人是基…

记录|链接MySQL数据库实现学生管理系统

目录 前言一、管理系统的后台数据库1.1 创建DB库1.2 创建login表和student表login表student表 二、窗体创建1.1 VS项目框架1.2 窗口1设计:登录窗口所需控件界面效果 1.3 窗口2设计:学生信息管理界面添加新界面所需控件界面效果 1.4 窗口3设计&#xff1a…

用低代码平台搭建了一套贷前进件系统,1天搞定!

贷前进件系统是什么 贷前进件系统是指金融机构(如银行、消费金融公司等)在贷款申请过程中,用于收集、整理、审核和管理借款人申请资料的系统。该系统是贷款流程中的重要环节,主要作用在于提高贷款申请的处理效率,降低…

滑动变阻器的未来发展趋势和前景如何?是否有替代品出现?

滑动变阻器是常见的电子元件,主要用于调节电路中的电阻值。随着科技的不断发展,滑动变阻器的未来发展趋势和前景也引起了广泛关注。 滑动变阻器的未来发展将更加注重智能化,随着物联网、人工智能等技术的快速发展,滑动变阻器也将与…

Transformer中的位置编码:绝对位置编码、相对位置编码与旋转位置编码

1. 引言 Transformer模型自2017年提出以来,凭借其在序列到序列任务中的优异表现,迅速成为自然语言处理(NLP)领域的主流模型。与传统的循环神经网络(RNN)不同,Transformer模型完全基于自注意力机…

Java 入门指南:反射机制

RTTI RTTI(Run-Time Type Identification)是一种在运行时确定对象类型的机制。它是一种编程语言特性,主要用于在运行时动态识别和处理对象的实际类型。 通过 RTTI,可以在运行时根据对象的实际类型执行相应的操作。这在处理多态对…

sdn nce insight

SDN(Software-Defined Networking) 和 NFV(Network Functions Virtualization) 是现代网络架构中的两项关键技术,它们共同推动了网络的虚拟化、自动化和灵活性。尽管它们各自有不同的焦点和应用领域,但通常…

HarmonyOS应用四之页面加载构建以及数据请求

目录: 1、加载网络页面/本地页面/html页面2、页面布局3、HTTP/HTTPS的数据请求4、上传图片并保存数据 1、加载网络页面/本地页面/html页面 // xxx.ets import { webview } from kit.ArkWeb; import { BusinessError } from kit.BasicServicesKit;Entry Component s…

Java面试八股之消息队列中推模式和拉模式分别有哪些使用场景

消息队列中推模式和拉模式分别有哪些使用场景 消息队列的推模式(Push)和拉模式(Pull)各有不同的使用场景和优缺点。下面我会详细介绍这两种模式及其适用场景: 推模式(Push) 特点:…

进哥在线shinyapps工具(自备)

Jingle’s shinyapps toolkit – 王进的个人网站 (jingege.wang) 一些常用生物信息学分析可视化apps,以及一些分子生物学分析工具(尴尬,一直忘记附上链接) Jingles toolkit 可以进行多种分析: 1. General plots示例…

putty中修改默认窗口大小和字体、字号

在WinSCP中调用putty,发现默认窗口太小,字号也很小,非常不友好。现在显示器都是1080p起步,所以很有必要修改之。 以中文版v0.70为例,方法: 1. 点击左上角图标 ,选择下拉菜单中的“修改设置”&…

Qt-信号和槽(8)

目录 信号的概念 Qt中的信号三要素 connect函数 connect的原型 connect的使用 信号函数和槽函数 参数匹配 close关闭槽函数 运行结果 第一个问题:怎么知道 手册使用 第二个问题,为什么可以直接传递函数指针 自定义槽函数 第一种自定义槽函…

Flask详细教程

1、Flask是什么? Flask是一个非常小的PythonWeb框架,被称为微型框架(类似Java的SpringBoot);只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制&a…

前端css动画transform多个属性值写法

X轴平移400px transform: translateX(400px); X轴平移400px并缩小0.5倍 transform: translateX(400px) scale(0.5); X轴平移400px并旋转45度 transform: translateX(400px) rotate(45d…

农产品智慧物流系统pf

TOC springboot537农产品智慧物流系统pf 第1章 绪论 1.1 课题背景 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。所以各行…

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了,今天微软发布 Windows 11 Canary 新版本,此次版本号已经转移到 Build 27xxx,首发版本为 Build 27686 版。 此次更新带来了多项改进,包括 Windows Sandbox 沙盒功能切换到 Microsof…

『 Linux 』利用UDP套接字实现简单群聊

文章目录 服务端通过传入命令处理实现远程命令执行使用Windows编辑UDP客户端实现Windows远程控制Linux接收套接字的其他信息UDP套接字简单群聊服务端UDP套接字简单群聊客户端运行测试及分离输入输出 参考代码 服务端通过传入命令处理实现远程命令执行 『 Linux 』利用UDP套接字…