第四章
录音数据,每次读到的数据大小为88200Byte,同录音时每次从音频设备读取的大小相同,并写入音频设备实现放音,直到每次读取的音频数据的累积等于文件音频数据长度,或切换录音为止,连续切换播放录音,需要结束并回收上次录音的线程资源。
删除录音文件:点击选中的录音文件,通过接口remove( wav格式文件路径)删除即可。
自动播放功能:点击播放按钮即可实现自动播放录音,播放录音实现如上所述,当一个录音文件播放完后,会自动进入循环播放录音模式,点击该按钮可停止。
返回录音界面:隐藏当前窗口,显示录音窗口。
录音、播放录音功能实现可参考 图2 录音播放录音功能实现流程图。 设计模板及效果图:
图4-5 放音界面设计模板
第四章
图4-6 放音界面效果图
4.3 录像、拍照界面的设计及功能实现
4.3.1 录像、拍照界面的设计
录像、拍照界面包括拍照、录像选择标签,拍照、录像按钮,录像播放窗口按钮,图像刷新显示区域,返回按钮。
4.3.2 录像功能的实现
当进行拍照、录像界面时,首先初始化V4L2 视频框架,通过接口video_init_device(&window->video,\
打
开
\视频设备,通过接口video_start_capturing(&window->video)开启图像捕捉功能,开启线程通过V4L2接口video_get_frame(&window->video, video_frame_rgb, rgb)实时获取摄像头中图像数据并将yuv数据转换rgb格式数据,,GTK中的绘图函数只能够显示rgb格式的数据。需要将摄像头yuv数据转化成rgb数据。
获取摄像头数据在开发板屏幕显示,通过GTK在屏幕实时显示需要刷新绘图区域,实时使用gtk_widget_queue_draw()接口就会自动调用曝光事件所连接
第四章
的回调函数,回调函数中通过调用gdk_draw_rgb_image()接口刷新屏幕从而实现实时显示;
录像时,点击选中录像标签,点击录像按钮,就会开启录像线程,实时获取图像并写入视频文件,直到点击该按钮停止为止。由于rgb数据是原始数据未压缩,直接存储采集的数据会导致视频文件很大,浪费内存空间,所以需要将rgb数据压缩,即将rgb格式的数据转化为jpg格式的数据进行存储,rgb转jpg的函数为:
int compress_rgb24_to_jpeg_buffer(unsigned char *rgb24,
unsigned int width, unsigned int height, unsigned char *jpeg_buffer, int buffer_size, int quality);
视频文件内容 = jpg的大小+jpg内容[+jpg的大小+jpg内容]...
4.3.3 拍照功能的实现
拍照功能,首先点击选中拍照标签,点击录像、拍照按钮,通过调用接口摄像头就会实时捕捉一张图像,但摄像头捕获的图像是由yuv转换的rgb,要通过图片格式转换函数:void rgb24_to_bmp(unsigned char *rgb24, char *bmp_name, int width, int height)将rgb图像转换为bmp格式图片,并按照当前时间取名保存bmp格式文件。
拍照、录像功能实现可参考 图3 录像、拍照功能实现流程图 点击返回主窗口按钮时,会反初始化视频设备,关闭图像捕捉设备。
第四章
设计模板和效果图如下:
图4-7 录像拍照界面设计模板
图4-8 录像拍照界面效果图
第四章
4.4 播放视频、图片界面设计及功能实现
4.4.1 播放视频界面设计
播放视频界面主要包含:图像显示区域,视频文件列表,删除视频文件按钮,
返回按钮。
4.4.2 播放视频界面功能的实现
播放视频界面功能:显示mpg格式文件列表,删除视频文件,返回录像、拍照窗口。
视频文件显示及播放功能实现:进入播放录音界面先通opendir 和readdir
读取指定路径的.mpg文件并显示在屏幕上,点击屏幕上的.wav文件时,分栏列表会产生一个信号,触发选择文\事件,调用事件回调函数,打开选择的视频文件,不停读取视频文件中的图像,先读取jpg大小,再读取jpg数据,将读取的图像显示在电容屏的窗口上,由于读出的图像的格式为jpg格式,所以要将图像数据通过接口再转化为rgb数据格式,转化函数为:int decompress_jpeg_buffer_to_rgb(unsigned char *jpeg_buffer,
int jpeg_size, unsigned char **rgb, int *width, int *height))。
直到读取不到视频数据,视频播放完或者切换视频为止,连续切换播放视频,需要结束并回收上次播放的线程资源。
录像文件的删除同音频文件删除功能实现方式相同。