全志——视频录制、播放

一、录制

使用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

三、车机指令信号

dvrtest作为一个后台进程一直在运行,解析CAN发送的命令参数,开启预览录制及关闭,同时指定显示区域
  1. 使用 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消息的具体格式,您可能需要调整代码中的解析逻辑。
在实际应用中,还需要考虑错误处理和异常情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春风从不入睡、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值