解决三星ARM11开发板摄像头采集程序源码出现的Bug

市面上比较流行的飞凌OK6410A/飞凌OK6410B或者是友善之臂的arm11开发板亦或是华天正的arm11开发板使用的都是三星公司的32位CPU。
前阵子发现了这些开发板视频采集方面存在的共同Bug:当用MFC压缩摄像头采集的H264视频的时候,由于这些开发板用的是三星公司提供的摄像头压缩源码,这个源码存在一个Bug,在采集视频的时候输入“e”采集视频,输入“x”退出采集,可是连续采集视频的时候,也就是连续输入“e”时出现错误“segment…”。
首先三星的源码是:

while (1) {

        key = getchar();

        if(key == 'e')
            encoding_flag = TRUE;
        else if(key == 'x') {
            finished = 1;
            pthread_exit(0);
        }

        if (encoding_flag == TRUE) {

            pthread_mutex_lock(&mutex);

            handle = mfc_encoder_init(LCD_WIDTH, LCD_HEIGHT, 30, 1000, 30);

            sprintf(&file_name[0], "Cam_encoding_%dx%d-%d.264", LCD_WIDTH, LCD_HEIGHT, ++film_cnt);
            printf("Name of encoded file : Cam_encoding_%dx%d-%d.264\n", LCD_WIDTH, LCD_HEIGHT, film_cnt);
            fflush(stdout);

            /* file create/open, note to "wb" */
            encoded_fp = fopen(&file_name[0], "wb");
            if (!encoded_fp) {
                perror(&file_name[0]);
            }

            /* Codec start */
            start = 1;
            ret = ioctl(cam_c_fp, VIDIOC_STREAMON, &start);
            if (ret < 0) {
                printf("V4L2 : ioctl on VIDIOC_STREAMON failed\n");
                exit(1);
            }

            for(yuv_cnt=0; yuv_cnt < frame_num; yuv_cnt++){
                frame_count++;

                /* read from camera device */
                if (read(cam_c_fp, g_yuv, YUV_FRAME_BUFFER_SIZE) < 0) {
                    perror("read()");
                }


                if(frame_count == 1)
                    encoded_buf = mfc_encoder_exe(handle, g_yuv, YUV_FRAME_BUFFER_SIZE, 1, &encoded_size);
                else
                    encoded_buf = mfc_encoder_exe(handle, g_yuv, YUV_FRAME_BUFFER_SIZE, 0, &encoded_size);          

                fwrite(encoded_buf, 1, encoded_size, encoded_fp);
            }

            frame_count = 0;

            /* Codec stop */
            start = 0;
            ret = ioctl(cam_c_fp, VIDIOC_STREAMOFF, &start);
            if (ret < 0) {
                printf("V4L2 : ioctl on VIDIOC_STREAMOFF failed\n");
                exit(1);
            }

            printf("100 frames were encoded\n");
            printf("\nSelect ==> ");

            mfc_encoder_free(handle);

            fclose(encoded_fp);

            encoding_flag= FALSE;

            pthread_mutex_unlock(&mutex);
        }
    }

上述源码将压缩好的数据写入文件,每次输入”e“则重新生成一个新文件,从中不难看出每次生成一个文件之后执行了:

ret = ioctl(cam_c_fp, VIDIOC_STREAMOFF, &start);
            if (ret < 0) {
                printf("V4L2 : ioctl on VIDIOC_STREAMOFF failed\n");
                exit(1);
            }

这段代码的作用是关闭视频流,这儿关闭了视频流之后实际上是关闭了摄像头,所以如果要再次输入”e“之后重新压缩视频成H264文件需要重新初始化摄像头。
因此,如果要重复压缩视频只需简单地将这句删除即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值