云天 发表于 2022-9-12 22:24:35

行空板——视频播放器


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

【准备硬件】
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

【演示视频】
https://www.bilibili.com/video/BV1MG41137eh?share_source=copy_web

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

{:6_215:}666666学到了

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

一边放mp4,一边放mp3

小企鹅 发表于 2022-9-13 17:37:20

厉害厉害

木子呢 发表于 2022-9-13 18:35:22

厉害

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

播放流畅度很好

岑剑伟 发表于 2022-9-14 11:25:28

我竟无言以对,拍案叫绝,提起荷包,到小黄鱼市场走一走
页: [1]
查看完整版本: 行空板——视频播放器