音视频数据采集及单向传输的实现(海思3516EV200平台)

 

目录

2.硬件选型

2.1远端无线装置

2.1.1音视频采集模块

2.1.2光电转换模块

2.2本地接受设备

2.2.1光电转换模块

2.2.2音视频还原模块

3.串口配置

4.音视频采集

5.音视频接收与显示

6.更换摄像头注意事项

7.创建flash生产文件


 前不久接到一个项目,需求是将摄像头拍摄的监控视频通过激光传输到另外一个终端上。因为传输只能是单向的,终端只能被动接收数据并显示。接到这个项目笔者也有些为难,现行的视频传输都是双向通信,虽然是摄像头不断发送数据,但是还是有控制帧的存在的,链路变成单向传输,则视频马上就会中断,所以必须要实现一个新的通信协议和物理模型来实现。

 

2.硬件选型

项目的物理结构图如下图所示:

2.1远端无线装置

要求面积小,厚度薄,功耗低,可电池供电,属于微小型装置

2.1.1音视频采集模块

  1. 采集摄像头视频和麦克风音频,压缩成H.264(包含音视频)视频图像为1080P,30FPS;音频采样率和位宽尽量高,以提高声音采集质量;
  2. 摄像头采用数字接口,暂定为MIPI接口;
  3. 麦克风为模拟信号;
  4. 通过USB转串口与光电转换模块对接,将H.264/H.265码流发出;
  5. 此模块处理平台暂定选择HI3516EV200,面积小,功耗低,有现成开发板可供调试。板子有摄像头、MIC、USB、网络,可以完成项目原型验证。

2.1.2光电转换模块

  1. 将音频采集模块的串行码流转换为激光,发送给接收方
  2. 发送速率可达百兆比特(100Mbps)

2.2本地接受设备

2.2.1光电转换模块

  1. 接收远端装置发送的激光,转换为串口转USB的电学信号传给音视频还原模块

2.2.2音视频还原模块

  1. 接收光电转换模块传递的信号
  2. 解码H264/H.265,通过LCD还原图像,通过扬声器、耳机还原声音
  3. 此平台处于本地接收端,可以选用较大的处理器

这里USB转串口模块选择FT4232H模块,该模块RS232/RS422/RS485串口传输数据速率高达12M。完全满足项目需求。

3.串口配置

海思提供SDK默认不支持FT4232H串口,需要修改内核配置响应驱动,配置方法如下:

  1. 进入内核目录:cd linux-4.9.y/
  2. 打开内核配置:make menuconfig
  3. 进入驱动配置
  4. 保存配置并编译内核

make clean

make uImage

cp ./arch/arm/boot/uImage ./uImage.3516ev200

 

添加FTDI驱动后,我们需要在编码的时候配置串口的速率,可以参考如下代码:

// 设置为特诉波特率,比如200000
int set_speci_baud(int fd, int baud)
{
    struct serial_struct ss, ss_set;
    struct termios Opt;
    tcgetattr(fd, &Opt);

    cfsetispeed(&Opt, B38400);
    cfsetospeed(&Opt, B38400);

    tcflush(fd, TCIFLUSH);/*handle unrecevie char*/
    tcsetattr(fd, TCSANOW, &Opt);

    if((ioctl(fd, TIOCGSERIAL, &ss)) < 0)
    {
        printf("BAUD: error to get the serial_struct info:%s\n", strerror(errno));
        return -1;
    }

    ss.flags = ASYNC_SPD_CUST;
    ss.custom_divisor = ss.baud_base / baud;
    if((ioctl(fd, TIOCSSERIAL, &ss)) < 0)
    {
        printf("BAUD: error to set serial_struct:%s\n", strerror(errno));
        return -2;
    }

    ioctl(fd, TIOCGSERIAL, &ss_set);
    printf("BAUD: success set baud to %d,custom_divisor=%d,baud_base=%d\n",
            baud, ss_set.custom_divisor, ss_set.baud_base);

    return 0;
}

串口的速率大小可以设置范围包括:12000000、8000000、6000000、4000000、3000000、2000000、1000000……。速率大小必须是24000000的约数,即速率大小必须能整除24000000。

4.音视频采集

视频采集通过修改海思的示例代码rtsp实现,程序基本流程为:

  1. 软件初始化,设置好音视频的格式、初始化数据队列;
  2. 打开usb串口,设置波特率;
  3. 创建视频和音频采集线程;
  4. 循环读取音视频队列,有数据就通过串口发送出去。

示例代码:

    while(init_serial() < 0)
    {
        sleep(1);
    }  

    set_speci_baud(serial_fd, nRate);
    signal(SIGINT, SAMPLE_VENC_HandleSig);
    signal(SIGTERM, SAMPLE_VENC_HandleSig); 
  
    SAMPLE_AUDIO_RegisterVQEModule();
    pthread_create(&id,NULL,SAMPLE_VENC_1080P_CLASSIC,NULL);
    //显示 时间,名称和logo
    osdinit(pszName);
    sleep(1);
    pthread_create(&audio,NULL,SAMPLE_AUDIO_CLASSIC,NULL);    
    while(1)
    {
        pn= GetStreamInfoFromQueue();

        if(pn != NULL)
        {
            pInfo = (pStreamInfo)pn->pdata;

            head.id = htons(nID);
            head.type = pInfo->type;
            head.len = htons(pInfo->len);
            head.pts = htonll(pInfo->u64TimeStamp);
            head.crc16 = htons(GetCCITTCrc((unsigned char*)pInfo->buf, pInfo->len));

            uart_send(serial_fd, &head, sizeof(CStreamHead));
            uart_send(serial_fd, pInfo->buf, pInfo->len);
  
            RealseStreamInfo2Pool(pn);
            lSendCount++;
        }
        
        usleep(1);
    }

在视频采集线程(SAMPLE_COMM_VENC_GetVencStreamProc函数)中,将接收到的视频数据加入到队列中,具体代码很简单,这里不列举了。

在音频采集线程(SAMPLE_COMM_AUDIO_AencProc函数)中,将接收到的音频数据加入到队列中,插入队列前,要去掉数据的前4个字节,因为这4个字节是海思的音频数据头。

 

       好了,发送端的代码改动量很小,很容易实现。将编译好的软件放到文件系统的bin目录下,然后在rcS中添加一行启动软件命令就可以实现板子上电后直接开始发送数据了。

       另外需要注意的时例程中在void *SAMPLE_VENC_1080P_CLASSIC(void *p)函数中,去掉下面的代码,否则自启动会报错:

printf("please press twice ENTER to exit this sample\n");
    getchar();
    getchar();

 替换为:

while(1)
    {
        sleep(1);
    }

5.音视频接收与显示

      因为是单向传输数据,所以我们没办法用开源的工具来显示音视频数据了,所以我们得自己实现音视频的接收、显示与存储。

笔者是老古董了,最拿手的就是c++,所以使用MFC+SDL+ffmpeg实现。

思路就是创建串口接收线程,数据分析线程,保存线程,视频播放线程,音频播放线程。

串口接收线程主要通过串口接收数据,并抛给数据分析线程来处理。


                
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值