在用SPCE3200做数码相册时遇到的几个问题及解决方法

本文档详细介绍了嵌入式系统中图像和音频处理的关键技术,包括TFT与CSI颜色模式配置、拍照功能实现、背景音乐播放及与其他功能的协调、MP4播放与图片显示之间的切换等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. TFT与CSI 颜色模式

 可能出现的问题是: TFT上显示的图像颜色不对 或 拍出照片颜色不对
 
 分析: TFT和CSI都有两种颜色模式: RGB565 和 YUV 模式. 
       必须使TFT和CSI工作在同一种颜色模式下时才能显示出正确的图像.

TFT的颜色模式设置:    
 在TFT驱动的TFT_Driver.c文件实现:
 TFT_SetBufFmt(TFT_FRAME_FMT1, TFT_FRAME_FMT2); //
其中:TFT_FRAME_FMT1 和 TFT_FRAME_FMT2 的定义在 TFT_Config.h中定义如下:

#define  TFT_FRAME_FMT1  C_TFT_BUF_RGB565 //这一对为RGB565模式的配置参数 
#define  TFT_FRAME_FMT2  C_TFT_BUF_YUV

//#define  TFT_FRAME_FMT1  C_TFT_BUF_4Y4U4Y4V //这一对为YUV模式的配置参数
//#define  TFT_FRAME_FMT2  C_TFT_BUF_YCBCR

CSI的颜色模式设置:
 CSI_Init(QVGA, RGB565IN, RGB565OUT, TFT_BUFFER0_SA, TFT_BUFFER0_SA, TFT_BUFFER0_SA); //RGB565模式
      或CSI_Init(QVGA, YUVIN, YUVOUT, TFT_BUFFER1_SA, TFT_BUFFER1_SA, TFT_BUFFER1_SA); //YVU模式


2. 在拍照时,MPEG只能对YUV数据进行编码,在拍照时CSI要设置为:YUV模式,而通常情况下,TFT工作在RGB565模式下,所以在拍照程序中,拍照前的预览阶段,要把CSI也设置为RGB565模式,而在拍照那一该要将CSI切换到YUV模式. 同时我们的LCD为320*240(QVGA)分辨率的,而题目要求拍出640*480(VGA)的照片,所以在拍照瞬间我们让CSI工作在VGA模式下.


拍照程序大致实现方法:
  
void Photo(...) //拍照函数
{
  .... 
  CSI_Init(QVGA, RGB565IN, RGB565OUT, TFT_BUFFER0_SA, TFT_BUFFER0_SA, TFT_BUFFER0_SA); //先将CSI设为 QVGA, RGB565模式,以在LCD上显示,进入预览状态
 
  ....
 
  if(照命令)
 {
   CSI_Init(VGA, YUVIN, YUVOUT, TFT_BUFFER1_SA, TFT_BUFFER1_SA, TFT_BUFFER1_SA); //切换CSI为VGA, YUV模式,并改变其缓冲区地址为TFT_BUFFER1_SA, ,不让其在LCD上显示
   CSI_Pause();     //CSI暂停      
   camera_jpg(TFT_BUFFER1_SA, 0xa0900000); // 对TFT_BUFFER1_SA地址开始的的数据进行编码并保存为照片
   CSI_Init(QVGA, RGB565IN, RGB565OUT, TFT_BUFFER0_SA, TFT_BUFFER0_SA, TFT_BUFFER0_SA); //拍照完成后,CSI返回QVGA,RGB565模式,以再次返回预览状态.
  } 
  ....
}


这样即可实现拍照功能.

 

3. 背景音乐功能:  读MP3与读图片冲突

   因为MP3和图片都存在SD卡上,而MP3播放是在中断服务程序中(MP3_Service_Loop()函数中)读取数据的,在播放图片时如果加上背景 音乐功能,则可能会出现正在读图片时,突然来了中断,要读取MP3数据,这样就会导致文件系统冲突,出现死机现象.

   解决方法:
 
 定义一个全局变量ufat_read_flag 来表示当前有没有正在读取图片
在读取图片之前先让ufat_read_flag=1表示正在读取图片,读完图片之后再让
ufat_read_flag=0.
 而在IRQ63中断中在调用MP3_Service_Loop()之前先判断ufat_read_flag是否为0,为0里再读取MP3,否则

,表示正在读取图片数据,跳过本次中断,暂不调用MP3_Service_Loop(),下次中断来时再判断是否要执行MP3_Service_Loop();


程序大概如下:

int ufat_read_flag = 1;

/*在读取图片的文件中*/
...
ufat_read_flag = 1; 
read(picture); //读取图片
ufat_read_flag = 0;
...


/*在中断中*/
void IRQ63(int _vector_, void *data, void *reg_stack)

 MP3_Service_Loop_ISR();
 if(!ufat_read_flag)
     {
  MP3_Service_Loop();
  MP3_Service_Loop();
  MP3_Service_Loop();
     }
}

这样即可解决读MP3和读图片冲突的问题.
 

4. 背景音乐:读图片时间太长,会出现MP3音效差,声音有些卡.

解决方法:
   把图片分为一小块一小块的读取:

 参考程序:
 ...
 while(1)
 {
   ufat_read_flag = 0;   //问题3中所说的在读取图片之前加一个表示正在读取图片的标志.
   if(read(fd,buffer+256*num,256) < 256) //把图片分为256大小的块来读取
  break;    //如果读完,则跳出while(1),去显示图片
     ufat_read_flag = 1;
   num++;
 }
 TFT_PutPicture(Win,0,0,buffer,IMAGE_SCALE);
 ...

5. 播放MP4后返回时无法再显示图片 或 显示图片后无法播放MP4
    这是因为在播放MP4和显示JPG图片时对MPEG编解码器的设置是不同的,所以最好在播放MP4之前和之后调用mp4_reset()和MPEG4_Init()
这两个函数,如下 :
  ...
 mp4_reset();
 MPEG4_Init();
 MP4Play((const LOAD_INFO *)&LoadMP4Info); // 播放MP4文件
 mp4_reset(); 
 MPEG4_Init();
 ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值