zoukankan      html  css  js  c++  java
  • 【嵌入式开发】树莓派支持硬编码的视频套件

    Camkit (Camera toolKit)

    Camkit是一个摄像头相关的工具箱,使用C语言写成,包含了从:图像采集–>色彩转换–>H264编码–>RTP打包–>网络发送的全套接口。

    可到这里下载已编译好的二进制版本。

    编译

    Camkit采用cmake构建系统,编译之前请确认已经安装了cmake。

    遵循以下步骤完成编译和安装:

    1
    2
    3
    4
    5
    6
    cd Camkit_source_dir
    mkdir build
    cd build
    cmake ../ -Dkey=value
    make
    make install

    其中-Dkey=value是可以配置的选项,支持的选项如下:

    1. DEBUG=ON|OFF,是否打开调试选项
    2. PLATFORM=FSL|RPI|OFF, 选择所使用的平台(Freescale, RaspberryPi或FFmpeg),具体见下文
    3. CC=path_to_c_compiler|OFF, 指定C编译器的路径
    4. ROOTSYS=path_to_root_sys|OFF, 指定查找库和头文件的根路径(配合3选项可以用来做交叉编译)

    Camkit的视频采集采用标准的V4L接口,通常的USB摄像头均可以支持。

    Camkit的色彩转换和H264编码支持三种平台,分别是是:
    1. FFmpeg (采用ffmpeg编码,依赖于avcodec.so和swscale.so)
    2. Raspberry Pi (采用OpenMax硬编码,依赖于ilclient.a, vcsm.so, bcm_host.so, openmaxil.so等库,由于色彩转换部分使用了ffmpeg,因此还依赖于其中的swscale库)
    3. Freescale I.MX6 (采用IPU和VPU硬编码,依赖于ipu.so和vpu.so)

    PC平台编译安装

    使用ffmpeg编码,Camkit可以在PC上使用,原则上应该是跨平台的,但由于作者的开发主要是在Linux上完成,其他平台未经测试,今后有时间再做移植。下面主要介绍如何在Linux上编译安装。

    在Linux上编译安装非常简单,以Ubuntu为例,首先安装编译环境:

    1
    sudo apt-get install cmake libavcodec54 libavcodec-dev libswscale2 libswscale-dev

    然后遵循上面的构建步骤,使用如下命令构建和编译:

    1
    2
    3
    4
    5
    mkdir build
    cd build
    cmake ../
    make
    make install

    至此,libcamkit.so就已经安装到你的系统里了,默认应该在/usr/local/lib下,头文件在/usr/local/include下。demo中的程序默认不会安装,可在build/demo目录下找到并运行,参照demo程序就可开发自己的应用了。

    树莓派平台编译安装

    要在树莓派上使用可以选择在PC上交叉编译,也可将源代码拷到树莓派上直接编译,这里介绍后一种方式。

    首先用scp之类的工具将Camkit的源代码拷到树莓派上,进入源码目录。由于树莓派运行的也是Linux系统,原则上可以和PC上一样使用ffmpeg库,但是实际效果非常卡顿,每秒仅有1~2帧,cpu消耗90%左右,因此推荐使用针对树莓派的OpenMax方案,下面是编译说明。

    使用OpenMax需要一些头文件和库,这些库一般都在/opt/vc/目录下,不需要另外安装,除了一个库例外:libilclient.a。这是一个简单的封装库,可以到github下载源代码,两个.c文件、一个.h文件和一个Makefile,将上上层目录下的Makefile.include文件也下载下来。将这些文件都拷到树莓派上,用以下命令安装:

    1
    2
    3
    4
    5
    6
    mkdir -p build/one/two
    cp ilclient.h ilclient.c ilcore.c Makefile build/one/two
    cp Makefile.include build
    cd build/one/two
    make
    cp libilclient.a /opt/vc/lib

    最后一步将编译好的库拷贝到/opt/vc/lib目录下。

    除了OpenMax库之外,Camkit做色彩转换是还是使用了ffmepg中的libswscale库,因此需要在树莓派上先安装,方式可PC上的相同,通过apt-get安装libswscalelibswscale-dev即可(如何是Arch平台使用pacman -S ffmpeg)。

    一切都做完之后就可以编译Camkit了,进入Camkit源码目录,使用如下命令编译安装:

    1
    2
    3
    4
    5
    mkdir build
    cd build
    cmake ../ -DPLATFORM=RPI
    make
    make install

    这样,Camkit就已经安装到你的树莓派上了,路径和PC上的相同,demo程序在build/demo目录下。

    使用

    Camkit的接口非常简单方便,每个子功能均遵循类似的接口。

    1
    2
    3
    xxxHandle = xxx_open(xxParams);     // 打开xxx handle,例如: capture_open, convert_open...
    ...                     // 具体操作
    xxx_close(xxxHandle);    // 关闭handle,例如capture_close, convert_close...

    一般调用步骤如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    struct cap_handle *caphandle = NULL;    // capture操作符
    struct cvt_handle *cvthandle = NULL;   // convert操作符
    struct enc_handle *enchandle = NULL;   // encode操作符
    struct pac_handle *pachandle = NULL;   // pack操作符
    struct net_handle *nethandle = NULL;   // network操作符
     
    struct cap_param capp;      // capture参数
    struct cvt_param cvtp;      // convert参数
    struct enc_param encp;      // encode参数
    struct pac_param pacp;      // pack参数
    struct net_param netp;      // network参数
     
    // 设置各项参数
    capp.xxx = xxx
    ...
    cvtp.xxx = xxx;
    ...
    encp.xxx = xxx;
    ...
    pacp.xxx = xxx;
    ...
    netp.xxx = xxx;
    ...
     
    // 使用设置好的参数打开各项功能
    caphandle = capture_open(capp);
    cvthandle = convert_open(cvtp);
    enchandle = encode_open(encp);
    pachandle = pack_open(pacp);
    nethandle = net_open(netp);
     
    capture_start(caphandle);       // 开始capture
    while(1)
    {
        capture_get_data(caphandle, ...);    // 获取一帧图像
     
        convert_do(cvthandle, ...);    // 转换,YUV422=>YUV420, 如果你的摄像头直接支持采集YUV420数据则不需要这一步
     
        while (encode_get_headers(enchandle, ...) == 1)     // 获取h264头,PPS/SPS
        {
        ...
        }
     
        encode_do(enchandle, ...);      // 编码一帧图像
     
        pack_put(pachandle, ...);   // 将编码后的图像送给打包器
        while(pack_get(pachandle, ...) == 1)    // 获取一个打包后的RTP包
        {
            net_send(nethandle, ...);   // 将RTP包发送出去
        }
    }
    capture_stop(caphandle);        // 停止capture
     
    // 关闭各项功能
    net_close(nethandle);
    pack_close(pachandle);
    encode_close(enchandle);
    convert_close(cvthandle);
    capture_close(caphandle);

    Note:

    1. 其中的每一个子功能都可以独立使用,例如只做采集,或者图像编码之后写入文件而不做打包和发送等等。
    2. 如果是使用官方的树莓派摄像头,则采集部分不可用,需要另外写代码,但后面的编码打包等功能均可正常使用。

    PS: demo目录有两个完整的例子,可以参考之。

    实例–在树莓派上运行demo查看实时录像

    demo/cktool.c是运用Camkit的一个例子,实现了Camkit支持的全部功能。

    使用方法:

    1
    $cktool [options]

    options:
    -? 显示帮助信息
    -d 是否显示调试信息
    -s 设置步骤 0/1/3/7/15 (0:只做采集,1:采集+转换, 3:采集+转换+编码(默认),7:采集+转换+编码+打包,15:采集+转换+编码+打包+发送)
    -i 设置打开的摄像头设备(默认/dev/video0)
    -o 设置写入的文件
    -a 设置网络端的ip地址
    -p 设置网络端的端口号
    -c 设置采集图像格式: 0: YUYV(默认), 1: YUV420
    -w 设置视频宽 (640)
    -h 设置视频高 (480)
    -r 设置编码帧率 kbps (1000)
    -f 设置帧率 (15)
    -t 设置图像是否交织 (0)
    -g 设置编码的gop大小 (12)

    假设我们要在树莓派上使用Camkit,将树莓派和PC连在同一个路由器上。

    1
    RPI(Camkit) <==> 路由器 <==> PC (VLC)

    首先,按照上面的讲解完成编译,在build/demo目录下可以看到一个cktool的可执行程序。

    配置树莓派开启摄像头支持并分配gpu_memRaspbian系统通过sudo raspi-configArch系统参见Wiki

    然后,在PC上用记事本打开demo/video.sdp文件,修改ip地址为PC的ip地址,假设为192.168.1.2,设置端口,假设为8888。运行VLC播放器,打开demo/video.sdp文件。

    最后,在树莓派上运行:

    1
    #cktool -s 15 -a 192.168.1.2 -p 8888

    至此,应该就可以在PC端看到树莓派的实时视频了。

    via https://git.oschina.net/andyspider/Camkit

    本文来自:树莓派实验室
    链接地址:http://shumeipai.nxez.com/2015/01/28/raspberry-pi-supports-hard-coded-video-suite.html
  • 相关阅读:
    sql2slack alash3al 开源的又个轻量级工具
    pgspider fetchq 扩展docker镜像
    godns 集成coredns 的demo
    godns 简单dnsmasq 的dns 替换方案
    aviary.sh 一个基于bash的分布式配置管理工具
    使用coredns 的template plugin实现一个xip 服务
    nginx 代理 coredns dns 服务
    基于nginx proxy dns server
    几个不错的geodns server
    spring boot rest api 最好添加servlet.context-path
  • 原文地址:https://www.cnblogs.com/huty/p/8518366.html
Copyright © 2011-2022 走看看