stm32 播放高帧率高分辨率视频和照片详细制作过程(播放Bad Apple为例)

您所在的位置:网站首页 跑步数据图片和视频怎么制作手机 stm32 播放高帧率高分辨率视频和照片详细制作过程(播放Bad Apple为例)

stm32 播放高帧率高分辨率视频和照片详细制作过程(播放Bad Apple为例)

2024-07-17 10:35| 来源: 网络整理| 查看: 265

stm32 播放高帧率高分辨率视频和照片详细制作过程

下文以播放Bad Apple视频为例。

文章是我边调试边写的,质量不好请见谅。

文章目录 stm32 播放高帧率高分辨率视频和照片详细制作过程硬件条件:方案一:方案二: 实现过程:1.移植代码2.具体实现2.1视频素材处理2.2将图片合成到一个文件,并处理。坑点: 2.3读取文件2.4JPEG硬件解码2.5DMA2D显示 3.性能测试4.后期目标 注意点: 所有资料都会总结好放到 网盘里,提取码:8e1z

更新:

其实格式工厂里就可以提取,真的是眼瞎没看到,浪费时间了。

但是这个生成出来的jpg文件,文件名格式是imgge_x.jpg,没有按照我们所学的0001-xxxx这样的格式,下面写一段python代码来改一下文件名字(太多了,不可能手改的)。

image-20220118235043712

import os import re path = "./badapple_800_480/" #图片文件夹的路径 pic_name_length = 13 #不需要修改的文件名长度,包括(.jpg) pic_rename_format = "Image%04d.jpg" #需要修改的名字格式 def file_rename(): suffix = 0 files = os.listdir(path) # change current work path os.chdir(path) for file in files: file_name_size = len(file) if file_name_size jpg apple='H:\PersonalProducts\badapple\badapple_800_480.mp4'; obj = VideoReader(apple); for i = 1 : 6510 %视频3分37秒,每秒30帧 badApple = read(obj,i); imwrite(badApple,strcat('H:\PersonalProducts\badapple\output_jpg\badapple_',num2str(i,'%04d'),'.','jpg')); end 2.2将图片合成到一个文件,并处理。

使用安富利的文件合并助手,非常nice一款软件。

**注意:**生成格式,选格式1,不要加逗号。

image-20220120135236723

将所有的jpg都合成到一个bin文件里了,那么每张图片我们如何知道长度和地址呢。

我们需要做一个存索引的文件,我这里做成Inde.txt,将输出的窗口数据复制到txt,然后保存好放到tf卡中。

坑点:

最开始我采用的是格式2,不加逗号的格式输出。然后在stm32读取的时候花费了不少时间,fatfs没有一行一行读取,不像python有readline怎么方便。而且我们不知道每行的长度,类似下图。这就导致不能读一行出来后,取偏移地址,再取长度了。(最后勉强用这个实现了)

如果输出格式1,不加逗号,那么格式都是一样的,如下图。每行长度确定,我们就可以一次固定读两行的长度。再取出两个16进制,前面的是起始地址,相减后就是所需读取的长度。

image-20220120140204068

image-20220120140430046

2.3读取文件

将合成的bin文件和索引文件都放到了sd卡后,就可以开始读bin文件了。

读取bin文件,需要一个bug,直接找jpg最大的图片,看它是多少自己就定义多少,一般就几十k。

然后上面说了读取索引文件的方法,就可以获取到索引地址和长度。

2.4JPEG硬件解码

将读取到的数据缓存和数据长度代入jpeg解码api接口,while()等待结束。

2.5DMA2D显示

将得到的YCbCr格式的图片数据,代入dma2d的api接口,即可显示。

最后根据所需的图片大小,循环调用即可显示一个视频。下面是我用格式2输出的代码,后面可以改成格式1的,直接采用我的这个必有问题。

for(i = 0; i 10000)offset += 1;index_read_index += offset; /* ******************************************************************* */ f_lseek(&JPG_File, index_read_index); //更改索引 f_read(&JPG_File, Index_Buffer, 37, &JPG_FileCount); // 读取文件 算上换行回车,一行37个 从对应格式中获取长度 f_close(&JPG_File); //关闭文件 sscanf(Index_Buffer, "0x%8x // Image%*d.jpg (%d)", &hexADDR, &pic_size); //获取偏移和长度 f_open(&JPG_File, "badapple_jpg.bin", FA_OPEN_EXISTING | FA_READ); f_lseek(&JPG_File, hexADDR); f_read(&JPG_File, JPG_FileBuffer, pic_size, &JPG_FileCount); // 读取文件 一行36个 从对应格式中获取长度 f_close(&JPG_File); //关闭文件 JPEG_Decode_DMA((uint32_t)JPG_FileBuffer,pic_size, JPEG_OUTPUT_DATA_BUFFER); // 调用DMA解码 while( JPEG_Decode_WaitingforEnd() != DecodeComplete ); // 等待解码完成 DMA2D_CopyBuffer( 0 , 0, (uint32_t *)JPEG_OUTPUT_DATA_BUFFER, (uint32_t *)LCD_FRAME_BUFFER ); // 使用DMA2D对解码后的图片进行显示 iTimeEnd = HAL_GetTick(); printf("%dmsd\r\n", (iTimeEnd - iTimeStart)); } 3.性能测试 sd卡挂载fatfs后读取资源(0-2ms一次,具体看sd卡质量,和sdmms时钟)jpeg硬件解码时间 800*480的分辨率下,仅需10ms左右,越小的图片越快。480 * 272试了下才3-4ms。dma2d将转化完的结果,转化成rgb到屏幕上,大概12ms。 4.后期目标 这方面弄好了后,如果后期使用gui,lvgl或者touchgfx的话,当成一个底层驱动移植好,就可以做到sd卡的图片浏览功能,sd卡中的视频播放功能**(注:需要上位机处理好的资源文件)**,gui中图片资源的转化,比bin文件的图片资源节省了数十倍的存储空间(速度上差距很小)。在上位机上做好jpeg解码,解码后的数据可以直接供给dma2d转化**(不是转化成rgb的bin资源)**,节省了转化的时间(小资源文件没必要,本来就1-2ms),这样读1-2ms,显示12ms,理论上来说可以稳定的做到60hz。 注意点:

**2.**本来一帧图片是768000的,但是他这个软件转换不了800 * 480,只有800 * 450那么也就是720000。这里被坑了下。

image-20220116112238980

3.使用网上采用的type会出现bug,和自己算出来的大小不一致,这里采用安富利的文件合并助手。

image-20220116141828259

**4.**视频转图片的是用的matlab,也可以自己改用python等等



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3