B站有屏幕的地方就有烂苹果badapple是怎么做出来的?

1.将原视频转换成一张一张单个的图片

这里使用KMPlayer软件来制作,下载地址:https://www.onlinedown.net/soft/38003.htm

(1)拖放视频到KMPlayer,鼠标右键点击,选择捕获—>高级捕获
 (2)按照下图设置捕获参数并捕获帧数,因为小熊派的显示屏分辨率大小是240x240,那么一张RGB565的图片需要占用240x240x2=115200字节的缓存,这是无法在Keil上编译通过的,经过测试分辨率大小为180x160的图片是可以编译通过的,所以这里设置的尺寸大小是180x160,如果你用的0.96寸oled那么这里的尺寸就要设置为128x64了。这样一张RGB565的图片仅需要186x160x2=57600字节的缓存,另外每秒钟现实的帧数自己定,帧数显示越多显示效果越好。设置参数完毕后选择点击开始,然后点击播放视频三角符号,开始捕获帧。
 (5)接下来视频开始播放,会看到你的KMPlayer软件安装目录下的Capture文件夹下有很多图片产生

2、利用Image2Lcd v3.2批量生成bin文件

图片全部捕获完成后,使用Image2Lcd将bmp批量转换成bin文件

3、合并所有bin文件

1.把KMPlayer软件安装目录下的capture文件夹中batch文件夹剪切粘贴到C盘根目录
 2.按下键盘的WIN+R调出命令窗口,依次输入如下命令

cd C:\batch
copy  /b  *.bin  badapple.bin

 3.合并完成后在batch文件夹最下面找到badapple.bin文件剪切粘贴到内存卡。

4、编写MCU程序

前面几步已经做好了bin文件,接下来就是写程序了,我这里用的是小熊派的板子,程序用的是杨总的代码,他的码云仓库:

https://gitee.com/morixinguan/personal-open-source-project/tree/master/8.video_demo


下载之后,不需要修改任何代码就可以直接下载代码了。因为我的是180x160分辨率的图片所以只需要改一下宏定义就可以了。

/*一张RGB565图片占用的缓存大小*/
#define PIC_SIZE 57600 // 180x160x2=57600
/*在LCD的X坐标*/
#define DISPLAY_START_X 30
/*在LCD的Y坐标*/
#define DISPLAY_START_Y 40
/*LCD宽度分辨率*/
#define OLED_WIDTH   180
/*LCD高度分辨率*/
#define OLED_HEIGHT  160
/*用于显示的缓存区*/
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 < file_size / PIC_SIZE ; i++)
    {
    
    
        /*5.读取一张图片,一张图片的大小是PIC_SIZE,
        		将读取出来的图片存放到缓存区framebuffer数组里*/
        res = f_read(&fil, framebuffer, PIC_SIZE, &br);

        if(FR_OK != res)
            return -2;

        /*6.将整个数组赋值给显示接口,显示图片*/
        LCD_Show_Image(DISPLAY_START_X, DISPLAY_START_Y, OLED_WIDTH, OLED_HEIGHT, (uint8_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 ;
}

猜你喜欢

转载自blog.csdn.net/qq_39400113/article/details/115188263