mjpg_streamer学习记录(1)

从github上下载最新源码,修改顶层cmakelist如下,添加交叉编译选项,准备好libjpeg等库

set (CMAKE_C_COMPILER "/home/chaosi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")
set (CMAKE_CXX_COMPILER "home/chaosi/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++")

依次执行以下命令即可编译生成可以在其嵌入式linux板卡上运行的程序

cd mjpg-streamer-experimental
mkdir _build
cd _build
cmake -DENABLE_HTTP_MANAGEMENT=ON ..
make
sudo make install

首先列出程序框架:

global结构体就是上图中的global_buffer,充当输入和输出的中转站

struct _globals {
    int stop;

    /* input plugin */
    input in[MAX_INPUT_PLUGINS];
    int incnt;

    /* output plugin */
    output out[MAX_OUTPUT_PLUGINS];
    int outcnt;
};

调用input_init,在input_run函数中会分配buf空间

用context描述每个摄像头

context *pctx;
pglobal = param->global;//指针指向全局的global仓库
pglobal->in[id].context = pctx; //pglobal的私有数据

调用init_videoIn初始化struct vdIn *videoIn;并分配以下两个和摄像头采集相关的缓冲区

if(init_videoIn(pctx->videoIn, dev, width, height, fps, format, 1, pctx->pglobal, id, tvnorm)
struct vdIn {
    unsigned char *tmpbuffer;
    unsigned char *framebuffer;
};

然后执行input_run函数创建摄像头线程,由此可见,input_uvc是mjpg_streamer和v4l2uvc之间的桥梁

int input_run(int id)
{
    input * in = &pglobal->in[id]; //获得上层指针,以取出包含摄像头描述的结构体
    context *pctx = (context*)in->context;
    /* create thread and pass context to thread function */
    pthread_create(&(pctx->threadID), NULL, cam_thread, in);

 在cam_thread中获取每一帧图像,如果不是jpeg格式就转换,如果是jpeg格式就直接copy到global的buf中

if(uvcGrab(pcontext->videoIn) < 0) {    //错误会设置退出信号

DBG("copying frame from input: %d\n", (int)pcontext->id);
//从v4l2uvc中struct vdIn的buf拷贝图像至global仓库
pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->tmpbytesused);
/* copy this frame's timestamp to user space */
pglobal->in[pcontext->id].timestamp = pcontext->videoIn->tmptimestamp;
待续
mjpg_streamer是一个开源的多线程实时流媒体服务器,可用于将应用程序产生的多种形式的视频流(如MJPEG,JPEG以及YUV等)转换为HTTP流的格式,可通过网络从任何支持流媒体的设备或程序进行接收和播放。LCD则是液晶显示屏的简称,它是一种常用的显示设备,可以在各种电子设备中使用。 mjpg_streamer可以与LCD配合使用,通过将LCD设备与mjpg_streamer服务器连接,我们可以将来自摄像头或其他视频源的实时图像流转发到LCD显示屏上,从而实现图像的实时显示。 使用mjpg_streamer连接LCD的具体步骤如下: 1. 配置mjpg_streamer服务器,确保其能够接收并处理来自摄像头或其他视频源的流数据。 2. 将LCD连接到计算机或嵌入式设备,确保其正常工作。 3. 在mjpg_streamer服务器的配置文件中,指定将视频流输出到LCD设备。 4. 启动mjpg_streamer服务器,开始传输视频流到LCD设备。 5. 在LCD设备上,显示传输过来的视频流。可以根据需要进行调整和优化。 通过将mjpg_streamer和LCD结合使用,可以实现在LCD设备上显示来自摄像头或其他视频源的实时图像流。这在监控系统、视讯会议、机器视觉等领域具有广泛应用,为用户提供了方便快捷的图像展示方式。同时,通过调整mjpg_streamer服务器和LCD设备的配置,还可以实现多种不同的显示效果和功能,满足用户的个性化需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值