美文网首页
实现数据循环缓存、缓存数据写入文件

实现数据循环缓存、缓存数据写入文件

作者: chenwr2018 | 来源:发表于2019-08-22 16:57 被阅读0次

开辟一块内存来循环缓存H264码流,避免碰撞导致录像数据无法写入外存储器中。能够及时将内存碰撞前的一段视频及时存储到内置Flash中。

/************************************************************************
**函数:dvr_h264_prerec_start
**功能:循环缓存H264码流
**参数:
        [in] channel        - 通道号,从1开始
        [in] type           - 1:视频,2:音频
        [in] u64timestamp   - 时间戳(单位us)
        [in] tm             - 底层产生数据时的系统时间
        [in] buf            - 音视频数据
        [in] buf_len        - buf数据长度(in bytes)
**返回:失败返回-1,成功返回0
************************************************************************/
INT32S dvr_h264_prerec_start(CHNNO_APP  channel,
                           INT8U       type,
                           INT64U      u64timestamp,
                           time_t      tm,
                           const void *buf,
                           INT32U      buf_len
                           )
{
    INT32U size_to_max, ret;
    H264_BUFFER_T *pbuf;
    char save_file[100] = {0};
    INT32S fd, len;
    
    ret = dvr_h264_prerec_init(channel);
    if (0 != ret) {
        FK_TRACE_ERROR("[cwr] dvr_h264_prerec_init fail\n");
        return -1;
    }
    pbuf = &s_h264_buf[channel];
    /* 循环缓存海思传过来的H264码流 */
    if (pbuf->H264_buf_offset + buf_len >= H264_MAXBUFSZIE) {
        size_to_max = H264_MAXBUFSZIE - pbuf->H264_buf_offset;
        if (size_to_max < buf_len) {
            FK_TRACE_INFO("[cwr] buf cycle\n");
            memcpy(pbuf->h264_buf + pbuf->H264_buf_offset, buf, size_to_max);
            memcpy(pbuf->h264_buf, (INT8S *)buf + size_to_max, buf_len - size_to_max);
            pbuf->H264_buf_offset = (buf_len - size_to_max);
        }
    } else {
        memcpy(pbuf->h264_buf + pbuf->H264_buf_offset, buf, buf_len);
        pbuf->H264_buf_offset += buf_len;
    }

    /* 检测到碰撞将缓存数据存储内置Flash */
    if (true == g_fat_crash && false == pbuf->save_h264_state) {    
        snprintf(save_file, 100, "%s/crash_chn%d_save_h264.mp4", H264_SAVE_PATH, channel);
        fd = open(save_file, O_RDWR|O_CREAT|O_TRUNC);//覆盖原先数据O_TRUNC
        if(fd < 0) {
            FK_TRACE_ERROR("[cwr] create flash file fail\n");
            return -1;
        }
        /* 先写缓存区中旧的数据 */
        len = write(fd, pbuf->h264_buf + pbuf->H264_buf_offset, H264_MAXBUFSZIE - pbuf->H264_buf_offset);
        FK_TRACE_ERROR("[cwr] len = %d, H264_MAXBUFSZIE - pbuf->H264_buf_offset = %d\n", len, H264_MAXBUFSZIE - pbuf->H264_buf_offset);
        if (len != (H264_MAXBUFSZIE - pbuf->H264_buf_offset)) {
            FK_TRACE_ERROR("[cwr] write data fail %d\n", fd);
            if (0 != errno) {
                FK_TRACE_ERROR("[cwr] [err data] write data errno=%d (%s)!\n", errno, strerror(errno));
            }
            close(fd);
            return -1;
        }
        /* 接着写缓存中新的数据 */
        len = write(fd, pbuf->h264_buf, pbuf->H264_buf_offset);
        if (len != pbuf->H264_buf_offset) {
            FK_TRACE_ERROR("[cwr] write data fail %d\n", fd);
            if (0 != errno) {
                FK_TRACE_ERROR("[cwr] [err data] write data errno=%d (%s)!\n", errno, strerror(errno));
            }
            close(fd);
            return -1;
        }
        close(fd);
        FK_TRACE_INFO("[cwr] dvr_save_h264 file %s save suc\n", save_file);
        pbuf->save_h264_state = true;
    }
    return 0;
}

相关文章

  • 实现数据循环缓存、缓存数据写入文件

    开辟一块内存来循环缓存H264码流,避免碰撞导致录像数据无法写入外存储器中。能够及时将内存碰撞前的一段视频及时存储...

  • cmu440(2)Distributed File System

    客户端缓存 我们缓存什么? 只读文件数据和目录数据 由客户机写入的数据 什么时候写入服务器? 如果客户机宕机了,会...

  • django的cache

    查询逻辑就是先获取缓存,没有就去获取数据库的数据,写入缓存

  • Android-DiskLruCache

    DiskLruCache用于实现磁盘缓存,它通过将缓存文件写入文件系统实现缓存的效果。使用前先添加依赖 该方法用于...

  • python单例模式保存excel数据

    数据存在框架中样式 数据在框架中应当用缓存的形式 结束后写入文件,不然频繁写入导致出现问题excel 读取数据问题...

  • 库存是先删缓存还是先改db

    库存是先删缓存还是先改db 先改db再淘汰缓存 缓存失效 A读db数据是旧值 B改数据并淘汰缓存 A写入旧值到缓存...

  • Redis -- 缓存穿透和缓存雪崩

    缓存穿透 缓存穿透是指查询一个一定不存在的数据, 由于缓存是不命中时需要从数据库查询, 查不到数据则不写入缓存, ...

  • 分布式架构设计之数据层

    数据层: 缓存: 缓存穿透(注:如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去...

  • 缓存常见问题

    缓存穿透 含义 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,...

  • php内存缓存实现程序代码

    php内存缓存实现程序代码 1、普遍缓存技术:数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页...

网友评论

      本文标题:实现数据循环缓存、缓存数据写入文件

      本文链接:https://www.haomeiwen.com/subject/epcosctx.html