| 【项目背景】最近又看了一遍《红鞋子和七个小矮人》,画面精致、情节有新意。这个项目准备用行空板播放这个视频同时也要播放视频声音。
 
 【准备硬件】
 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)   #窗口全屏
 播放屏幕连续显示,需使用“cv2.waitKey(1)”。复制代码img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕
 
 因视频的帧频为25帧每秒,所以0.04秒播放1帧,因“cv2.waitKey(1)”占了0.001秒,所以每0.039秒播放1帧。复制代码
if cv2.waitKey(1) & 0xff== 27:
     break
 
 
 复制代码
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
 
 
 |