6.12 晴 周四
【写在前面】这个帖子记录的是我学习与复刻@云天老师的M10视频播放器。云天原文发在社区论坛,大家可以移步学习。

云天老师是社区中高手大神,是我仰望的对象,做的很多项目,喜欢但是却学习不明白。比如在这个帖子中,代码是云天老师写的,我复制过来后改了个参数。视频是按照云天老师的教程处理的。

【目标任务】
学习云天老师帖子,复刻M10视频播放器,播放子柒的如愿。
【提示】行空板M10开机,蓝牙音箱开机连接,程序运行播放视频。
材料清单
- M10 X1
- 2路18650电池座 X1 链接
- 18650电池 X2
- 蓝牙小音箱 X1
步骤1 硬件准备
2路18650电池座 结合18650电池可以用于户外设备供电和作为智能小车的移动电源使用的设备

该款2路18650电池座使用简单,可安装两节18650电池,具有micro和type-c两个充电输入口,输出口有USB接口输出和端口输出两种方式,支持5V/2A和3.3V/1A输出,其中5V输出端口×5,3.3V端口输出×5,USB输出×1(5V)。模块具有过充和过放保护,能够保护18650电池,有效增加18650电池的使用寿命。新版本新增了电池防反接保护和亚克力底板,反接保护避免了电池反接烧毁模块,亚克力底板能避免使用过程中误触和放置不当造成短路烧毁的情况。
其结合18650电池方便用户对微型设备的供电,可以用于户外设备供电和作为智能小车的移动电源使用。
接口介绍
按键控制模块开关,轻按开机,开机状态下,1s内连续轻按两次关机,拨码开关可以进行HOLD模式和NOMAL模式切换,当使用NOMAL档时,输出电流过低会自动关机,当使用HOLD档不会自动关机,会持续输出直到达到过放保护时才会关机,LED1,LED2,LED3,LED4代表当前电量,当充电时,其会闪烁,电池电量充满后会停止闪烁。
从DF商城入手了这个电池座,这样手中的18650电池就可以不用老吃灰了。
蓝牙音箱和M10的连接请在论坛中参考仔爸的教程。

步骤2 视频处理
在M10上播放视频,基本原理就是一边放MP4,一边放MP3。
而且M10的屏幕只有320*240像素,所以要对视频预处理。
格式工厂


原视频1920x1080,为9:6的比例。

点击输出设置,M10屏幕大小为320x240,为了不改变原视频9:6的长宽比例,设为320*180。如果原视频为4:3的最好,直接改为320*240。频数改为25帧/秒。

点击开始,就可得到分辨率320*180的视频。

下面从视频中分离出声音。



这样就得到了mp4视频和mp3声音。
步骤3 程序准备
下面还要准备一个视频封面,从视频中截取一张图片,最好是320*240大小,我这个是320*180。因为过一会要横屏播放,所以要旋转一下,如下back.jpg。

一个按钮图片,云天老师提供,an.png。

Mind+---python模式

切换到代码编程状态。
下面要把素材复制到项目中的文件中,从原文件夹直接拖拽进去就好。

import pygame
import time
import cv2
from unihiker import GUI
bf=False
bs=True
# 事件回调函数
def button_click1():
global bf
bf=True
u_gui=GUI()
屏幕=u_gui.draw_image(image="back.jpg",x=30,y=0)
按钮=u_gui.draw_image(image="an.png",x=90,y=130)
按钮.config(onclick=button_click1)
vd = cv2.VideoCapture()
vd.open("ruyuan.mp4")
screen_rotation = True
vd.set(cv2.CAP_PROP_FRAME_WIDTH, 320) #设置视频图像宽度
vd.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) #设置视频摄像头图像高度
vd.set(cv2.CAP_PROP_BUFFERSIZE, 1) #设置OpenCV内部的图像缓存,可以极大提高图像的实时性。
pygame.mixer.init()
pygame.mixer.music.load("ruyuan.mp3")
pygame.mixer.music.set_volume(50 / 100)
currenttime=time.time()
while True:
if bf==True:
if bs==True:
bs=False
cv2.namedWindow('windows',cv2.WND_PROP_FULLSCREEN) #窗口全屏
cv2.setWindowProperty('windows', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) #窗口全屏
pygame.mixer.music.play()
if time.time()-currenttime>=0.0305:
currenttime=time.time()
ret, img = vd.read()
if ret:
#img = cv2.resize(img,(320,240))
if screen_rotation:
img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕
cv2.imshow('windows', img)
else:
cv2.destroyAllWindows()
vd.set(cv2.CAP_PROP_POS_MSEC, 0)
bf=False
bs=True
if cv2.waitKey(1) & 0xff== 27:
break
代码的功能云天老师在他的教程中有介绍,这里只说明一下我改的几小处。
1、因为我的封面图片为320*180,所以图片位置的X坐标改为30。因为180+30+30=240。

2、修改为自己的视频和音频名字。

3、测试调整每帧图片的延时时长,云天老师的参考时间是0.039,我们可以根据播放时音画同步情况进行调整,比如我调整到0.0305比较满意。(你的视频可能是另外的延时时长)

代码解释请参考云天老师教程。
连接行空板M10,运行后调试。
附件
附件
评论