一、录制
使用dvr_test录制视频
运行dvr_test demo出现space not enought问题,修改/etc/dvrconfig.ini文件下对应的camera节点下cur_filedir属性无效
修改以下内容解决;
路径:buildroot/package/auto/sdk_lib/sdk_camera/DvrNormalMode.cpp
修改如下:
录制时出现摄像头画面异常,如下
摄像头型号与打印信息匹配:
但是出现画面异常,考虑是否该摄像头只支持720P,尝试修改
路径:vi buildroot/package/auto/sdk_lib/sdk_config/etc/dvrconfig.ini
修改为720P时,画面正常,仅支持720P@25的摄像头
CTRL+C时,程序未结束运行,应先初始化再发送处理信号
应用修改为支持6个摄像头
在buildroot/package/auto/sdk_lib/sdk_config/etc/dvrconfig.ini中修改video0/4/8/12的分辨率,添加video 16/17,最大支持四路同时录制
添加六路同时录制
修改如下:
六路显示异常,屏幕分割不正常
同时申请图层失败
定位问题代码:buildroot/package/auto/sdk_lib/sdk_disphwdisplay2.cpp +172
修改layer为6
发现六宫格摄像头画面,5, 6预览连接摄像头不显示,录制正常
用正常窗口与不正常的进行对比,完全一致
五六两个图层出错
定位到代码:
信息点1:
信息点2:
信息点3:每个通道最大4个图层
现在明确T527 单通道只支持到4层Layer,下面我们分两个步骤测试
前四个用通道1 后两个用通道2
channel 0+layer 0/1/2/3,channel 1+layer 0/1,组合实现六个显示不可行,具体原因询问科通无回复
具体原因:
T527两个channel通道,只有channel 0作为视频通道,最大只支持四分屏显示
二、播放
使用xplayerdemo播放器进行播放
1、运行播放器
xplayerdemo
2、设置文件路径
set url:/tmp/1.mp4
3、播放
play
4、退出
quit
使用tplayerdemo播放:
同时tplayerdemo也可播放音视频,例如需要播放的视频为1.mp4,并且该视频放在/etc目录下,则命令为:tplayerdemo /etc/1.mp4
三、车机指令信号

- 使用 Socket 进行通信
- 可以在dvr_test中创建一个 Socket 服务器,监听指定的端口,等待来自 CAN 总线参数传输。
- CAN 总线上的另一个程序可以通过 Socket 客户端连接到dvr_test,发送参数给它。
- dvr_test 在接收到参数后,进行相应的处理。
示例代码
cCopy Code#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
void run_command(int param) {
char command[256];
switch (param) {
case 1:
snprintf(command, sizeof(command), "dvr_test -c 1 0");
break;
case 2:
snprintf(command, sizeof(command), "dvr_test -c 2 0 4");
break;
case 3:
snprintf(command, sizeof(command), "dvr_test -c 3 0 4 8");
break;
default:
fprintf(stderr, "Unsupported parameter: %d\n", param);
return;
}
int status = system(command);
if (status == -1) {
perror("system");
}
}
int main() {
int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
// 创建套接字
if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
perror("socket");
return EXIT_FAILURE;
}
// 设置CAN接口
strcpy(ifr.ifr_name, "can0");
ioctl(s, SIOCGIFINDEX, &ifr);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
close(s);
return EXIT_FAILURE;
}
// 接收CAN消息
while (1) {
int nbytes = read(s, &frame, sizeof(struct can_frame));
if (nbytes < 0) {
perror("read");
break;
}
if (nbytes < sizeof(struct can_frame)) {
fprintf(stderr, "Incomplete CAN frame\n");
continue;
}
// 假设接收的参数在CAN数据字段的第一个字节中
int param = frame.data[0];
// 调用命令
run_command(param);
}
close(s);
return EXIT_SUCCESS;
}
代码说明
创建套接字:使用socket函数创建一个CAN原始套接字。
设置CAN接口:使用ioctl和bind函数将套接字绑定到指定的CAN接口(如can0)。
接收CAN消息:使用read函数从CAN总线接收消息。
解析参数并运行命令:
添加了一个run_command函数,根据接收的参数值选择不同的命令。
在run_command函数中,使用snprintf构建不同的命令字符串,并调用system函数运行命令。
如果接收到的参数不是1、2或3,则打印错误信息。
注意事项
确保CAN接口(如can0)已正确配置并正在运行。
根据CAN消息的具体格式,您可能需要调整代码中的解析逻辑。
在实际应用中,还需要考虑错误处理和异常情况。