電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 15|回復: 0
收起左側(cè)

手把手教你在STM32上實現(xiàn)OLED視頻播放(很簡單也很硬很肝!)

[復制鏈接]

193

主題

193

帖子

1532

積分

三級會員

Rank: 3Rank: 3

積分
1532
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2021-3-22 21:55:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
點擊上方「嵌入式實驗基地」,選擇「置頂公眾號」第一時間查看嵌入式筆記!


之前發(fā)了一個視頻,今天就來告訴大家怎么來實現(xiàn):
小熊派刷兒子騎摩的的抖音視頻,流暢度666666
我們這一代的年輕人基本上都很喜歡逛B站,大部分老人都認為我們這些年輕人上B站是為了看動漫、看游戲等等,誰跟你B站是用來看這些的,B站是用來學習的!







前一段時間就刷到一個視頻,某B站Up主利用小熊派開發(fā)板制作了一個Bad apple的視頻,如下:
https://www.bilibili.com/video/BV18t4y1X7jT?from=search&seid=9128578257339532185
并且Up主也公開了他的代碼和他制作的視頻文件。


原理很簡單,就是用一個視頻截圖軟件,將播放的視頻的圖片一張張截下來,利用工具將圖片轉(zhuǎn)換成bin文件,然后將bin文件拷貝到SD卡里,最后使用小熊派驅(qū)動讀取SD卡里對應的bin文件,然后將每一幀圖像讀出來顯示到LCD上即可,那么如何實現(xiàn)呢?大佬用小熊派顯示bad apple,我偏不,我就拿它來放別的視頻,舉一反三

,接下來我們直接上干貨,下面都是我自己閑時制作的作品:
1、利用KMplayer對視頻進行截圖下載地址:https://www.onlinedown.net/soft/38003.htm
(1)拖放視頻到KMPlayer
這個是我小孩騎摩的玩耍的視頻,直接拿來做效果了。

(3)鼠標右鍵點擊,選擇高級捕獲

(4)設置捕獲參數(shù)并捕獲幀

由于小熊派的屏幕的分辨率是240*240,一張RGB565的圖片需要占用115200字節(jié)的緩存,所以是無法在Keil上編譯通過的,為了能夠完成我的作品,所以我用了另外一個128*128的OLED屏,這樣一張RGB565的圖片僅需要32768字節(jié)的緩存,完全可以滿足我的設計需求,接下來設置參數(shù)完畢后選擇點擊開始,然后點擊播放視頻三角符號,開始捕獲幀。
(5)接下來視頻開始播放,會看到捕獲到的目錄下有很多圖片產(chǎn)生

2、利用Image2Lcd v3.2批量生成bin文件(1)圖片全部捕獲完成后,使用Image2Lcd將bmp批量轉(zhuǎn)換成bin文件





接下來在捕獲目錄下會自動生成一個batch目錄,目錄下就是生成的bin文件,每個bin文件對應的就是上一級目錄的每一張圖片。
3、利用Linux下的Cat命令合并所有bin文件將所有bin文件拷貝到Linux下能識別的區(qū)域,然后利用Linux下的Cat命令將所有的bin文件合并成一個文件,如下圖所示:

當然如果你有更好的合并文件的方法也可以,不一定要在Linux下使用Cat命令合并,這里我只是圖方便而已,合并完畢后將這個bin文件拷貝到SD卡的根目錄下。
4、編寫MCU程序之前已經(jīng)寫過很多現(xiàn)成的demo了,所以這里就不重新再寫了,如果有興趣的話請到我的碼云clone這個項目,我們只關心執(zhí)行bin文件的接口怎么寫就可以了,bin文件執(zhí)行接口實現(xiàn)如下:
/*一張RGB565圖片占用的緩存大小*/
#define PIC_SIZE 32768
/*在LCD的X坐標*/
#define DISPLAY_START_X 0
/*在LCD的Y坐標*/
#define DISPLAY_START_Y 0
/*LCD寬度分辨率*/
#define OLED_WIDTH   128
/*LCD高度分辨率*/
#define OLED_HEIGHT  128
/*用于顯示的緩存區(qū)*/
uint8_t framebuffer[PIC_SIZE] = {1};
int sd_show_picture_bin(const char *path)
{
    UINT br;
    FIL fil ;
    int offset = 0 ;
    int file_size ;
    FRESULT res ;
    /*1.打開傳進來的Fatfs文件路徑: path*/
    res = f_open(&fil, path, FA_READ);
    if(FR_OK != res)
        return -1;
    /*2.計算這個文件的大小*/
    file_size = f_size(&fil);
    /*3.初始化偏移變量為0*/
    offset = 0 ;
    /*4.計算bin文件里一共包含多少張圖片,然后不斷的給LCD進行顯示*/
    for(int i = 0 ; i if(FR_OK != res)
            return -2;
        /*6.將整個數(shù)組賦值給顯示接口,顯示圖片*/
        ST7735_DrawImage(DISPLAY_START_X, DISPLAY_START_Y, OLED_WIDTH, OLED_HEIGHT, (uint16_t *)framebuffer);
        /*7.將偏移往后加PIC_SIZE,就到了下一張圖片*/
        offset += PIC_SIZE;
        res = f_lseek(&fil, offset);
        if(FR_OK != res)
            return -3;
    }
    /*8.關閉文件描述符*/
    res = f_close(&fil);
    if(FR_OK != res)
        return -4;
    return 0 ;
}
這里要重點說一下,如果你是用別的分辨率的LCD,或者僅僅只需要在屏的某個位置顯示視頻,那么需要更改對應的宏定義,配置成你自己需要的參數(shù)即可,然后還需要更改LCD的顯示接口,將如上所示的ST7735_DrawImage函數(shù)替換成你自己顯示器上的函數(shù),不出意外,這個函數(shù)是通用的,在任意的彩屏OLED上都可以使用。然后,在默認SD卡掛載且LCD驅(qū)動正常的情況下,在while(1)循環(huán)里調(diào)用:
while (1)
{
   sd_show_picture_bin("0:/boy.bin");
}
這樣就可以實現(xiàn)視頻的循環(huán)播放了!就是這么簡單,小伙伴們趕緊制作起來了!來看下效果:
5、項目開源地址本節(jié)代碼已同步到碼云的代碼倉庫中,獲取方法如下:

碼云倉庫:
https://gitee.com/morixinguan/personal-open-source-project/tree/master/8.video_demo
獲取項目方法:
git clone https://gitee.com/morixinguan/personal-open-source-project.git
我還將之前做的一些項目以及練習例程在近期內(nèi)全部上傳完畢,與大家一起分享交流,如果有任何問題或者對該項目感興趣,歡迎加我微信:morixinguan一起交流學習。

如果要在小熊派自己的LCD上顯示,則將下載后的SD卡資源拷貝到SD卡的根目錄下,然后將第一個例程編譯并燒寫到開發(fā)板上即可,如果需要在ST7735上全屏顯示,則需自己去采購一個ST7735的屏。

本次的介紹就到這里啦,后面有更精彩的內(nèi)容,歡迎大家持續(xù)關注嵌入式實驗基地!
??如果你覺得對自己有幫助的話,給個贊,點個關注,點個在看,感謝前進的道路上有你的陪伴!


推薦閱讀
?開源電路のSTM32最小系統(tǒng)設計
?一種你值得擁有的簡單易實現(xiàn)的開關電路
?無線通訊之紅外通訊
?DIY一個離線語音控制器
?HAL庫us延時的3種實現(xiàn)方式?邏輯分析儀的簡單使用介紹(附帶iic,uart,spi數(shù)據(jù)波形分析)
?ART-PI重力感應無線智能小車第一彈----ART-PI擴展板設計?ART-PI重力感應無線智能小車第二彈----Onenet+wifi+L298N電機驅(qū)動?ART-PI重力感應無線智能小車第三彈----RT-Studio+MPU6050+MQTT發(fā)布訂閱?STM32 DAC音頻輸出
?pcb設計基礎?OLED+ESP8266網(wǎng)絡小時鐘
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表