364浏览
查看: 364|回复: 6

[项目] 行空板——视频播放器

[复制链接]
MonSeptember-202209127977..png

【项目背景】最近又看了一遍《红鞋子和七个小矮人》,画面精致、情节有新意。这个项目准备用行空板播放这个视频同时也要播放视频声音。
MonSeptember-202209126931..png

【准备硬件】
1.行空板
行空板是一款专为Python学习和使用设计的新一代国产开源硬件,采用单板计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。
同时,其自带Linux操作系统和Python环境,还预装了常用的Python库,让广大师生只需两步就能进行Python教学

MonSeptember-202209129187..png

2.迷你USB外置声卡
这款体积小巧、即插即用的免驱USB声卡可以满足您。声卡采用高性能音频USB DAC芯片,输出音效好;输入为USB接口,可以直接插入行空板、Jetson Nano、raspberry PI 400、电脑等主控或设备,轻松实现音频外置播放功能;输出为3.5MM立体声接口,可直接驱动耳机,或作为后极功放使用。
MonSeptember-202209125305..png

3.usb音箱
普通USB音箱
【项目设计】
使用Python OpenCV库来播放视频,使用pygame库mixer来同步播放音频。使用unihiker库 GUI制作播放按钮。
【知识准备】
1.OpenCV库
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby,GO的支持。

2.Pygame
MonSeptember-202209127055..png

Pygame是一个利用SDL库的写就的游戏库, 是一组用来开发游戏软件的 Python 程序模块。SDL,全名Simple DirectMedia Layer,SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。它包含Python函数和类,这些类和类允许使用SDL对CDROM、音频和视频输出、键盘、鼠标和操纵杆输入进行支持。
3.unihiker库
unihiker库是专门为了便于行空板的使用而开发的Python库。我们可以借助unihike库中的GUI类来实现屏幕显示和控制
【硬件连接】
MonSeptember-202209122874..png
【处理视频】
因行空板屏幕为320*240,所以将视频使用格式工厂处理,并将帧频设置成25帧每秒(程序中好处理)。并将视频 中音频导出成MP3。
【制作背景】
下载视频背景图片,用Fireworks处理图片320*240并旋转图片(行空板横屏),并制作按钮图片,按钮背景透明,生成PNG格式。
back.JPG an.png
【程序编写】
1、播放视频

导入OpenCV,加载视频,并初始化。
  1. import cv2
  2. vd = cv2.VideoCapture()
  3. vd.open("red.mp4")
  4. screen_rotation = True
  5. vd.set(cv2.CAP_PROP_FRAME_WIDTH, 320)  #设置视频图像宽度
  6. vd.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) #设置视频摄像头图像高度
  7. vd.set(cv2.CAP_PROP_BUFFERSIZE, 1)     #设置OpenCV内部的图像缓存,可以极大提高图像的实时性。

复制代码
导入pygame用mixer加载音频,并设置音量。

  1. import pygame
  2. pygame.mixer.init()
  3. pygame.mixer.music.load("red.mp3")
  4. pygame.mixer.music.set_volume(50 / 100)
复制代码
播放按钮界面设置

  1. from unihiker import GUI
  2. bf=False
  3. bs=True
  4. # 事件回调函数
  5. def button_click1():
  6.     global bf
  7.     bf=True


  8. u_gui=GUI()
  9. 屏幕=u_gui.draw_image(image="back.JPG",x=0,y=0)

  10. 按钮=u_gui.draw_image(image="an.png",x=90,y=130)
  11. 按钮.config(onclick=button_click1)
复制代码
主程序

  1. currenttime=time.time()
  2. while True:
  3.      if bf==True:
  4.       if bs==True:
  5.           bs=False
  6.           cv2.namedWindow('windows',cv2.WND_PROP_FULLSCREEN)    #窗口全屏
  7.           cv2.setWindowProperty('windows', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)   #窗口全屏
  8.           pygame.mixer.music.play()   
  9.       if time.time()-currenttime>=0.039:
  10.         currenttime=time.time()
  11.         ret, img = vd.read()
  12.         if ret:
  13.             #img = cv2.resize(img,(320,240))
  14.             if screen_rotation:
  15.                 img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕

  16.             cv2.imshow('windows', img)
  17.         else:

  18.             
  19.             cv2.destroyAllWindows()
  20.             vd.set(cv2.CAP_PROP_POS_MSEC, 0)   
  21.             bf=False
  22.             bs=True
  23.       if cv2.waitKey(1) & 0xff== 27:
  24.             break
复制代码
全屏播放
  1. cv2.namedWindow('windows',cv2.WND_PROP_FULLSCREEN)    #窗口全屏
  2. cv2.setWindowProperty('windows', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)   #窗口全屏
复制代码
使用横屏播放
  1. img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕
复制代码
播放屏幕连续显示,需使用“cv2.waitKey(1)”。

  1. if cv2.waitKey(1) & 0xff== 27:
  2.      break
复制代码
因视频的帧频为25帧每秒,所以0.04秒播放1帧,因“cv2.waitKey(1)”占了0.001秒,所以每0.039秒播放1帧。


  1. if time.time()-currenttime>=0.039:
  2.     currenttime=time.time()
  3.     ret, img = vd.read()
复制代码

【完整程序】

  1. import pygame
  2. import time
  3. import cv2
  4. from unihiker import GUI
  5. bf=False
  6. bs=True
  7. # 事件回调函数
  8. def button_click1():
  9.     global bf
  10.     bf=True

  11. u_gui=GUI()
  12. 屏幕=u_gui.draw_image(image="back.JPG",x=0,y=0)
  13. 按钮=u_gui.draw_image(image="an.png",x=90,y=130)
  14. 按钮.config(onclick=button_click1)

  15. vd = cv2.VideoCapture()
  16. vd.open("red.mp4")
  17. screen_rotation = True
  18. vd.set(cv2.CAP_PROP_FRAME_WIDTH, 320)  #设置视频图像宽度
  19. vd.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) #设置视频摄像头图像高度
  20. vd.set(cv2.CAP_PROP_BUFFERSIZE, 1)     #设置OpenCV内部的图像缓存,可以极大提高图像的实时性。
  21. pygame.mixer.init()
  22. pygame.mixer.music.load("red.mp3")
  23. pygame.mixer.music.set_volume(50 / 100)
  24. currenttime=time.time()
  25. while True:
  26.      if bf==True:
  27.       if bs==True:
  28.           bs=False
  29.           cv2.namedWindow('windows',cv2.WND_PROP_FULLSCREEN)    #窗口全屏
  30.           cv2.setWindowProperty('windows', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)   #窗口全屏
  31.           pygame.mixer.music.play()   
  32.       if time.time()-currenttime>=0.039:
  33.         currenttime=time.time()
  34.         ret, img = vd.read()
  35.         if ret:
  36.             #img = cv2.resize(img,(320,240))
  37.             if screen_rotation:
  38.                 img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕
  39.             cv2.imshow('windows', img)
  40.         else:
  41.             cv2.destroyAllWindows()
  42.             vd.set(cv2.CAP_PROP_POS_MSEC, 0)   
  43.             bf=False
  44.             bs=True
  45.       if cv2.waitKey(1) & 0xff== 27:
  46.             break

复制代码
【演示视频】

白凡  高级技师

发表于 2022-9-13 12:49:28

666666学到了
回复

使用道具 举报

 中级技师

发表于 2022-9-13 16:07:16

一边放mp4,一边放mp3
回复

使用道具 举报

小企鹅  高级技师

发表于 2022-9-13 17:37:20

厉害厉害
回复

使用道具 举报

木子呢  NPC

发表于 2022-9-13 18:35:22

厉害
回复

使用道具 举报

云天  高级技匠
 楼主|

发表于 2022-9-14 09:41:16

播放流畅度很好
回复

使用道具 举报

岑剑伟  初级技师

发表于 2022-9-14 11:25:28

我竟无言以对,拍案叫绝,提起荷包,到小黄鱼市场走一走
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail