【项目背景】最近又看了一遍《红鞋子和七个小矮人》,画面精致、情节有新意。这个项目准备用行空板播放这个视频同时也要播放视频声音。
【准备硬件】
1.行空板
行空板是一款专为Python学习和使用设计的新一代国产开源硬件,采用单板计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。 同时,其自带Linux操作系统和Python环境,还预装了常用的Python库,让广大师生只需两步就能进行Python教学
2.迷你USB外置声卡
这款体积小巧、即插即用的免驱USB声卡可以满足您。声卡采用高性能音频USB DAC芯片,输出音效好;输入为USB接口,可以直接插入行空板、Jetson Nano、raspberry PI 400、电脑等主控或设备,轻松实现音频外置播放功能;输出为3.5MM立体声接口,可直接驱动耳机,或作为后极功放使用。
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
Pygame是一个利用SDL库的写就的游戏库, 是一组用来开发游戏软件的 Python 程序模块。SDL,全名Simple DirectMedia Layer,SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。它包含Python函数和类,这些类和类允许使用SDL对CDROM、音频和视频输出、键盘、鼠标和操纵杆输入进行支持。
3.unihiker库
unihiker库是专门为了便于行空板的使用而开发的Python库。我们可以借助unihike库中的GUI类来实现屏幕显示和控制 【硬件连接】 【处理视频】 因行空板屏幕为320*240,所以将视频使用格式工厂处理,并将帧频设置成25帧每秒(程序中好处理)。并将视频 中音频导出成MP3。 【制作背景】 下载视频背景图片,用Fireworks处理图片320*240并旋转图片(行空板横屏),并制作按钮图片,按钮背景透明,生成PNG格式。 【程序编写】 1、播放视频
导入OpenCV,加载视频,并初始化。
- import cv2
- vd = cv2.VideoCapture()
- vd.open("red.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加载音频,并设置音量。 -
- import pygame
- pygame.mixer.init()
- pygame.mixer.music.load("red.mp3")
- pygame.mixer.music.set_volume(50 / 100)
复制代码
播放按钮界面设置
-
- 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=0,y=0)
-
- 按钮=u_gui.draw_image(image="an.png",x=90,y=130)
- 按钮.config(onclick=button_click1)
复制代码
主程序-
- 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.039:
- 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
复制代码
全屏播放
- cv2.namedWindow('windows',cv2.WND_PROP_FULLSCREEN) #窗口全屏
- cv2.setWindowProperty('windows', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) #窗口全屏
复制代码
使用横屏播放- img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕
复制代码
播放屏幕连续显示,需使用“cv2.waitKey(1)”。
-
- if cv2.waitKey(1) & 0xff== 27:
- break
复制代码
因视频的帧频为25帧每秒,所以0.04秒播放1帧,因“cv2.waitKey(1)”占了0.001秒,所以每0.039秒播放1帧。
-
- if time.time()-currenttime>=0.039:
- currenttime=time.time()
- ret, img = vd.read()
复制代码
【完整程序】
-
- 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=0,y=0)
- 按钮=u_gui.draw_image(image="an.png",x=90,y=130)
- 按钮.config(onclick=button_click1)
-
- vd = cv2.VideoCapture()
- vd.open("red.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("red.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.039:
- 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
-
复制代码
【演示视频】
|