ssh链接后提示这个
能ping通,文件交互也正常,就是无法命令行
LVGL视频播放界面实现方法
使用LVGL开发且需要在UI下显示视频或者显示摄像头数据,但是不知道如何实现,要么是只显示UI,要么就只显示视频。
可以看下视频播放的时候有哪些元素。
有播放按钮,进度条,设置等可交互的控件,这些都位于UI层。
UI的下方就是视频解码后的一帧数据,视频数据位于视频层。
一般UI层位于视频层的上方,如果UI层没有设置透明度,那么会有一个背景色,覆盖了视频层,导致只能看到背景色和一些控制按钮。
首先需要知道有图层的概念,下面的命令可以看到图层的信息:
root@TinaLinux:/# cat /sys/class/disp/disp/attr/sys
screen 0:
de_rate 300000000 hz, ref_fps:59
mgr0: 1280x800 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[1] force_sync[1] unblank direct_show[false] iommu[1]
dmabuf: cache[4] cache max[4] umap skip[0] umap skip max[18]
lcd output backlight( 50) fps:60.0 1280x 800
err:0 skip:67 irq:2300 vsync:0 vsync_skip:0
BUF enable ch[0] lyr[0] z[0] prem[N] a[pixel 0] fmt[ 77] fb[1280, 736; 640, 368; 640, 368] crop[ 0, 0,1280, 720] frame[ 0, 0,1280, 800] addr[fb200000,fb2e6000,fb359000] flags[0x 0] trd[0,0]
depth[ 0] BUF enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[ 0] fb[1280, 800;1280, 800;1280, 800] crop[ 0, 0,1280, 800] frame[ 0, 0,1280, 800] addr[ff800000, 0, 0] flags[0x
0] trd[0,0]
在内核初始化过程中,显示驱动注册/dev/fb0,会申请UI层,可以看到ch[1] lyr[0],一般UI就一个地址addr[ff800000, 0, 0],并且也是最顶层的z[16],混合模式a[pixel 255]表示由应用控制UI层的透明度。
视频播放(使用TPlayer接口)的时候会通过中间件申请视频图层,可以看到ch[0] lyr[0],并且yuv三个地址一直在变化addr[fb200000,fb2e6000,fb359000],通常视频会放到最底层z[0]。
当应用没有透明时,因为UI层的zorder比视频层大,因此只能看到UI,看不到视频,所以应用需要“挖空”。
下面代码里的屏幕,一般是指/dev/fb0,LVGL版本是8.3.2。
使用下面的代码前需要在lv_conf.h中设置参数:
#define LV_COLOR_SCREEN_TRANSP 1
/* 初始化屏幕风格 */
static lv_style_t style_scr_act;
if (style_scr_act.prop_cnt == 0) {
lv_style_init(&style_scr_act);
/* 默认不是透明的,后面按需要切换即可 */
lv_style_set_bg_opa(&style_scr_act, LV_OPA_COVER);
/* 一定要应用风格,不然也是没有效果的 */
lv_obj_add_style(lv_scr_act(), &style_scr_act, 0);
}
/* 这里根据按钮状态,切换不同风格,一种是UI能够透明看到底下的视频,一种是UI覆盖视频,视频就看不到了 */
if (lv_obj_has_state(btn, LV_STATE_CHECKED)) {
/* 这里切换为UI透明 */
lv_label_set_text(label, "Stop");
/* 这里设置屏幕是透明的 */
lv_disp_get_default()->driver->screen_transp = 1;
/* 这里设置屏幕背景是透明的 */
lv_disp_set_bg_opa(lv_disp_get_default(), LV_OPA_TRANSP);
/* 这里清空屏幕,不清空的话,可能不会生效 */
lv_memset_00(lv_disp_get_default()->driver->draw_buf->buf_act,
lv_disp_get_default()->driver->draw_buf->size
* sizeof(lv_color32_t));
/* 这里屏幕风格切换为透明的 */
lv_style_set_bg_opa(&style_scr_act, LV_OPA_TRANSP);
/* 通知风格变化,需要更新 */
lv_obj_report_style_change(&style_scr_act);
} else {
/* 这里切换为UI不透明,也就是覆盖视频 */
lv_label_set_text(label, "Play");
/* 这里设置屏幕是不透明的 */
lv_disp_get_default()->driver->screen_transp = 0;
/* 这里设置屏幕背景是不透明的 */
lv_disp_set_bg_opa(lv_disp_get_default(), LV_OPA_COVER);
/* 这里屏幕风格切换为不透明的 */
lv_style_set_bg_opa(&style_scr_act, LV_OPA_COVER);
/* 通知风格变化,需要更新 */
lv_obj_report_style_change(&style_scr_act);
}
各位大佬,请教一下D1s的tina linux,执行make menuconfig,修改以后保存之后。再次进入make menuconfig,发现之前修改的没有保存。怎么回事?
各位大佬,请教一下D1s的tina linux,执行make menuconfig,修改以后保存之后。再次进入make menuconfig,发现之前修改的没有保存。怎么回事?
LIBS += -L/root/workspace/allwinner/A40i/bsp/lichee/out/sun8iw11p1/linux/common/buildroot/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/ -lasound
在pro文件种添加这句好使了
我的开发环境是全志A40i,用的配套的底板和核心板,按照手册录音放音没有问题。
之后我想实现的功能是读取录音的数据,并将其转换为指定格式文件输出,同时将数据显示在屏幕上,以波形图的形式,就像录音实时跟踪那种效果
在已经搭建好源码和交叉编译环境下,我编译一个文件在终端提示找不到#include <alsa/asoundlib.h>文件,是因为这句话没有识别,但是系统实际是已经安装了ALSA库的
我的源码如下
#define ALSA_PCM_NEW_HW_PARAMS_API
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <alsa/asoundlib.h>
int main() {
long loops;
int rc;
int size;
unsigned int val;
int dir;
char *buffer;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
snd_pcm_uframes_t frames;
/*以录制模式打开*/
/* Open PCM device for recording (capture). */
rc = snd_pcm_open( &handle, "default", SND_PCM_STREAM_CAPTURE, 0);
if (rc < 0) {
fprintf(stderr, "unable to open pcm device");
exit(EXIT_FAILURE);
}
/*分配一个参数对象*/
/* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(¶ms);
/*初始化参数对象*/
/* Fill it in with default values. */
rc = snd_pcm_hw_params_any(handle, params);
if (rc < 0) {
printf("Err\n");
}
/* Set the desired hardware parameters. */
/*交错模式*/
/* Interleaved mode */
rc = snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED);
if (rc < 0) {
printf("Err\n");
}
/*PCM格式*/
/* Signed 16-bit little-endian format */
rc = snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE);
if (rc < 0) {
printf("Err\n");
}
/*设置通道数*/
/* Two channels (stereo) */
rc = snd_pcm_hw_params_set_channels(handle, params, 2);
if (rc < 0) {
printf("Err\n");
}
/*设置采样率*/
/* 44100 bits/second sampling rate (CD quality) */
val = 44100;
rc = snd_pcm_hw_params_set_rate_near(handle, params,
&val, &dir);
if (rc < 0) {
printf("Err\n");
}
/*没周期的帧数*/
/* Set period size to 32 frames. */
frames = 32;
rc = snd_pcm_hw_params_set_period_size_near(handle,
params, &frames, &dir);
if (rc < 0) {
printf("Err\n");
}
/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < 0) {
fprintf(stderr,
"unable to set hw parameters: %s/n",
snd_strerror(rc));
exit(1);
}
/* Use a buffer large enough to hold one period */
rc = snd_pcm_hw_params_get_period_size(params,
&frames, &dir);
if (rc < 0) {
printf("Err\n");
}
size = frames * 4; /* 2 bytes/sample, 2 channels */
buffer = (char *) malloc(size);
/* We want to loop for 5 seconds */
rc = snd_pcm_hw_params_get_period_time(params, &val, &dir);
loops = 5000000 / val;
while (loops > 0) {
loops--;
rc = snd_pcm_readi(handle, buffer, frames);
if (rc == -EPIPE) {
/* EPIPE means overrun */
fprintf(stderr, "overrun occurred/n");
//把PCM流置于PREPARED状态,这样下次我们向该PCM流中数据时,它就能重新开始处理数据。
snd_pcm_prepare(handle);
} else if (rc < 0) {
fprintf(stderr,
"error from read: %s/n",
snd_strerror(rc));
} else if (rc != (int)frames) {
fprintf(stderr, "short read, read %d frames/n", rc);
}
rc = write(1, buffer, size);
if (rc != size)
fprintf(stderr,
"short write: wrote %d bytes/n", rc);
}
//调用snd_pcm_drain把所有挂起没有传输完的声音样本传输完全
rc = snd_pcm_drain(handle);
//关闭该音频流,释放之前动态分配的缓冲区,退出
rc = snd_pcm_close(handle);
free(buffer);
return 0;
}
测试文件引用代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
测试程序说明都没有执行,只是单纯的引用alsa库,都无法编译通过
大佬们,我用v3s串口连接传感器,读取传感器数据时候出错,read(): Resource temporarily unavailable,网上说加select,我加了没用,怎么回事啊
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/select.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#define SENSOR "/dev/ttyS2"
int main()
{
int fd,ret;
struct termios option;
char cRest[]={0xFE, 0x01, 0x0d, 0x8A, 0x80, 0x0d};
char cPower_On[]={0xFE, 0x01, 0x0d, 0x0A, 0x00, 0x0d};
char cTem[10];
fd_set rset;
struct timeval timeout;
int rv;
fd = open(SENSOR,O_RDWR | O_NONBLOCK);
if(fd < 0)
{
perror("open()");
return -1;
}
if(fd > 0)
{
printf("uart2 open successfully!\n");
}
/*配置串口*/
memset(&option, 0, sizeof option);
option.c_iflag = IGNPAR;
option.c_cflag = B460800 | HUPCL | CS8 | CREAD | CLOCAL;
option.c_cc[VTIME] = 0;
option.c_cc[VMIN] = 10;
ret = tcsetattr(fd, TCSANOW, &option);
if (ret < 0)
{
printf("set USART2-352 failed\n");
return -1;
}
printf("USART2-352 is opened successfully! \n");
/*配置传感器*/
write(fd,cRest,6);
sleep(1);
write(fd,cPower_On,6);
while(1)
{
// FD_ZERO(&rset);
// FD_SET(fd,&rset);
//
// timeout.tv_sec = 5;
// timeout.tv_usec = 0;
memset(cTem, 0, 10);
// rv = select(fd+1,&rset,NULL,NULL,&timeout);
// if(rv < 0){
// perror("select error");
// continue;
// }
// else if(rv == 0){
// perror("select timeout");
// continue;
// }
// else
// {
ret=read(fd,cTem,10);
if(ret < 0)
{
perror("read()");
close(fd);
break;
}
if(ret > 0)
{
printf("read data : %s\n",cTem);
}
//}
}
close(fd);
return 0;
}
这是程序,编译没问题,运行成这样
[SND_ERR][xrun:931]Underrun occure!!! xrun_cnt=1
这是什么意思,偶尔会碰到。欠压吗
使用的FreeRTOS,默认SDK中lspsram运行的频率为192M,如果将频率提高至200M的话,会让lspsram的带宽有稍微的提高,请教一下各位大神有没有对应的教程