实战小项目之基于嵌入式的视频直播客户端

项目简介

  本项目就是RtmpApp嵌入式版本,在此基础上,融入之前的v4l2采集、ipu转码等内容,实现了usb摄像头的采集(yuv422)、ipu或者软件转码、x264编码、rtmp传输。

  与前一个项目最大的不同在于数据衔接,以及数据转换,这里使用单独线程进行编码传输,里面涉及友元类的使用,是如下

void PushStream::worker(const CapFbTest &ct){
    while(runflag){
        lastTime=RTMP_GetTime();
        if(frameIndex!=0){
            timeval begintime,endtime;
            gettimeofday(&begintime, NULL);
            RTMP_SendScreenCapture((char*)buffer,height,tick);
            gettimeofday(&endtime, NULL);
            double timeuse = 1000000*(endtime.tv_sec - begintime.tv_sec)+endtime.tv_usec-begintime.tv_usec;
            timeuse /=1000;
            printf("frame index %d time use %lf ms\n",frameIndex,timeuse);
        }

        switch(src_pix_fmt){
            case AV_PIX_FMT_YUV420P:
                //memcpy(buffer,ct.yuv420Frame,baseFrameSzie*3/2);
                buffer=(char *)ct.yuv420Frame;
                break;
            case AV_PIX_FMT_YUV422P:
                memcpy(buffer,ct.yuvFrame,baseFrameSzie*2);
                break;
            case AV_PIX_FMT_RGB24:
                memcpy(buffer,ct.rgbFrame,baseFrameSzie*3);
                break;
            default:
                printf("Not supports this format \n");
                break;
            }
        tick +=tick_gap;
        nowTime=RTMP_GetTime();
        sleepTime=tick_gap-nowTime+lastTime;
        printf("tick_gap %d nowTime %d lastTime %d sleep time %d\n",tick_gap,nowTime,lastTime,sleepTime);
        if(sleepTime>0)
            usleep(sleepTime*1000);
        frameIndex++;
    }
}

 

完整工程

  https://github.com/tla001/arm-rtmp

 

posted @ 2017-01-20 16:17  tla001  阅读(509)  评论(1编辑  收藏  举报
个人网站 www.tla001.cn