第三十一章 影片播放實驗
1)實驗平臺:正點原子DNK210開發板
2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0
3)購買連結:https://detail.tmall.com/item.htm?&id=782801398750
4)全套實驗原始碼+手冊+影片下載地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html
5)正點原子官方B站:https://space.bilibili.com/394620890
6)正點原子K210技術交流企鵝群:605557868
本章將介紹CanMV下的影片播放,透過CanMV提供的模組便能快速實現影片播放。透過本章的學習,讀者將學習到CanMV下video模組的使用。
本章分為如下幾個小節:
31.1 video模組介紹
31.2 硬體設計
31.3 程式設計
31.4 執行驗證
31.1 video模組介紹
video模組時CanMV內建的模組,video模組用於影片的播放,video模組可以對指定檔案系統路徑的影片檔案進行音影片解碼,然後將其音訊透過I2S介面進行輸出,影片資料則解碼後透過LCD進行顯示。
video模組為Video物件提供了open()方法,用於開啟一個檔案系統中的影片檔案,來進行影片的播放,並返回一個Video物件,open()方法如下所示:
video.open(path, record=False, interval=100000, quality=50, width=320, height=240, audio=False,
sample_rate=44100, channels=1)
open()方法用於開啟一個檔案系統中的影片檔案,來進行影片播放或錄製,同時返回一個Video物件,僅支援AVI格式的影片檔案。
path指的是影片檔案在檔案系統中的路徑。
record指的是是否進行影片錄製,當為False時,進行影片播放,當為True時,則進行影片錄製。
interval指的是影片錄製的幀間隔,單位為微秒。
quality指的是影片錄製時影像資料的壓縮質量,範圍為[1, 100]。
width指的是影片錄製的影像寬度。
height指的是影片錄製的影像高度。
audio指的是影片錄製時是否錄製音訊,當為False時,則不錄製音訊,反之為True時,則錄製音訊。
sample_rate指的是當錄製影片且錄製音訊時,錄製音訊的取樣率。
channels指的時方錄製影片且錄製音訊時,錄製音訊的聲道數。
open()函式的使用示例如下所示:
import video
video_player = video.open("/sd/VIDEO/play.avi")
video模組為Video物件提供了volume()方法,用於配置播放音訊時的音量,volume()方法如下所示:
video.volume(volume)
volume()方法用於配置播放音訊時的音量。
volume指的是配置的音量,範圍為[0, 100]。
volume()方法的使用示例如下所示:
import video
video_player = video.open("/sd/VIDEO/play.avi")
video_player.volume(30)
video模組為Video物件提供了play()方法,用於讀取影片檔案並解析播放,play()方法如下所示:
video.play()
play()方法用於讀取影片檔案並解析播放,每次執行play()函式會讀取並解析播放一小段影片檔案,因此play()函式需要配合迴圈使用。
play()方法的使用示例如下所示:
import video
video_player = video.open("/sd/VIDEO/play.avi")
while video_player.play():
pass
需要特別注意的時,使用video模組播放影片檔案的時,I2S0 Channel0、DMAC Channel4將會被系統佔用,並且在使用video模組播放影片檔案前,需要對I2S0 Channel0進行配置。
31.2 硬體設計
31.2.1 例程功能
- 使用video模組播放CanMV檔案系統中指定的影片檔案,影像透過LCD進行顯示,音訊透過板載揚聲器進行播放。
31.2.2 硬體資源
- LCD
LCD_RD- IO34
LCD_BL- IO35
LCD_CS- IO36
LCD_RST- IO37
LCD_RS- IO38
LCD_WR- IO39
LCD_D0~LCD_D7- SPI0_D0~SPI0_D7 - 數字功放NS4168
SPK_CTRL- IO21
IIS_SDOUT- IO31
IIS_BCK- IO32
IIS_LRCK- IO33
31.2.3 原理圖
本章實驗內容,主要講解video模組的使用,無需關注原理圖。
31.3 程式設計
31.3.1 video模組介紹
有關video模組的介紹,請見第31.1小節《video模組介紹》。
31.3.2 程式流程圖
圖31.3.2.1 影片播放實驗流程圖
31.3.3 main.py程式碼
main.py中的指令碼程式碼如下所示:
from board import board_info
from fpioa_manager import fm
from maix import GPIO
from maix import I2S
import lcd
import video
lcd.init()
fm.register(board_info.SPK_CTRL, fm.fpioa.GPIO0)
fm.register(board_info.SPK_WS, fm.fpioa.I2S0_WS)
fm.register(board_info.SPK_SCLK, fm.fpioa.I2S0_SCLK)
fm.register(board_info.SPK_SDOUT, fm.fpioa.I2S0_OUT_D0)
spk_ctl = GPIO(GPIO.GPIO0, GPIO.OUT)
spk_ctl.value(1)
i2s_dev = I2S(I2S.DEVICE_0)
i2s_dev.channel_config(I2S.CHANNEL_0, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_16_BIT, cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)
# 構造Vedio物件並配置音訊播放音量
video_player = video.open("/sd/VIDEO/play.avi")
video_player.volume(30)
# 迴圈播放影片
while video_player.play():
pass
# 結束影片播放
video_player.__del__()
可以看到首先初始化了LCD併為GPIO以及I2S分配IO,然後控制數字功放NS4168的CTRL引腳為高電平,此時NS4168被配置為控制揚聲器播放音訊資料中的右聲道音訊。
接著是構造了一個I2S物件,並配置了I2S對應的通道為傳送模式,因為本實驗需要播放影片中的音訊資料。
再接著構造了一個Video物件,Video物件與檔案系統中的影片檔案進行繫結,然後配置了音訊播放的音量。
然後就是迴圈播放影片資料了,如果都沒有問題的話,此時應該能在LCD上觀察到影片畫面,並聽見DNK210開發闆闆載的揚聲器發聲了。
最後在影片檔案播放完畢後,結束影片播放,釋放影片播放佔用的資源。
31.4 執行驗證
將DNK210開發板連線CanMV IDE,同時將實驗例程目錄下的play.avi影片檔案放入SD卡根目錄下的media資料夾下後,點選CanMV IDE上的“開始(執行指令碼)”按鈕後,可以聽到DNK210開發闆闆載的揚聲器播放了play.avi影片檔案中的音訊,且LCD上顯示了影片中的畫面,如下圖所示:
圖31.4.1 LCD播放影片畫面