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

开辟一块内存来循环缓存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;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容