• LiveRTMP内置IPCamera实现RTMP直播摄像机功能


    LiveRTMP

    LiveRTMP是LiveQing团队开发的一套支持Windows、Linux、arm、Android、iOS等各种平台的高效RTMP推送库。
    LiveRTMP接收的是标准的H264流和AAC音频流。可以单独推送H264,也可以音视频混合推送。
    ##内置进IPCamera
    先初始化LiveRTMP和IPCamera的SDK,再调用IPCamera的SDK获取IPCamera的实时视频流。在实时流的回调中,调用LiveRTMP_SendPacket接口将音视频流实时传给LiveRTMP进行RTMP推送直播。值得注意的是如果需要推送音频的话,音频需要是AAC格式,如果没有AAC流,可以通过第三方工具转成AAC格式,如fdk-aac等。交叉编译后内置进IPCamera内部,就可以将普通的IPCamera升级成RTMP直播摄像机。

    Demo代码

    可参考代码中LiveRTMP_SDK项目的代码,这个Demo就是调用了摄像机的SDK获取实时视频流传给LiveRTMP库进行直播推送。如下代码是SDK视频流回调的处理,其他具体去下载代码查看。

    HI_S32 NETSDK_APICALL OnStreamCallback(HI_U32 u32Handle,
                                    HI_U32 u32DataType,	
                                    HI_U8* pu8Buffer,
                                    HI_U32 u32Length,
                                    HI_VOID* pUserData
                                    )
    {
        HI_S_AVFrame* pstruAV = HI_NULL;
    	HI_S_SysHeader* pstruSys = HI_NULL;
    	
    	if (u32DataType == HI_NET_DEV_AV_DATA)
    	{
    		pstruAV = (HI_S_AVFrame*)pu8Buffer;
    
    		if (pstruAV->u32AVFrameFlag == HI_NET_DEV_VIDEO_FRAME_FLAG)
    		{
    			if(g_RtmpHandle == 0 ) return 0;
    
    			if(pstruAV->u32AVFrameLen > 0)
    			{
    				unsigned char* pbuf = (unsigned char*)(pu8Buffer+sizeof(HI_S_AVFrame));
    
    				EASY_AV_Frame  avFrame;
    				memset(&avFrame, 0x00, sizeof(EASY_AV_Frame));
    				avFrame.u32AVFrameLen = pstruAV->u32AVFrameLen;
    				avFrame.pBuffer = (unsigned char*)pbuf;
    				avFrame.u32VFrameType = (pstruAV->u32VFrameType==HI_NET_DEV_VIDEO_FRAME_I)?EASY_SDK_VIDEO_FRAME_I:EASY_SDK_VIDEO_FRAME_P;
    				avFrame.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;
    				avFrame.u32TimestampSec = pstruAV->u32AVFramePTS/1000;
    				avFrame.u32TimestampUsec = (pstruAV->u32AVFramePTS%1000)*1000;
    				EasyRTMP_SendPacket(g_RtmpHandle, &avFrame);
    			}	
    		}
    		else
    		if (pstruAV->u32AVFrameFlag == HI_NET_DEV_AUDIO_FRAME_FLAG)
    		{
    			if(g_RtmpHandle == 0 ) return 0;
    
    			EASY_AV_Frame	avFrame;
    			memset(&avFrame, 0x00, sizeof(EASY_AV_Frame));
    			avFrame.u32AVFrameFlag = EASY_SDK_AUDIO_FRAME_FLAG;
    
    			if(pstruAV->u32AVFrameLen <= 4) return 0;
    
    			if(EasyInitAACEncoder(EASY_SDK_AUDIO_CODEC_G711A) == 0)
    			{
    				memset(m_pAACEncBufer, 0, 64*1024);
    				unsigned int iAACBufferLen = 0;
    				unsigned char* pbuf = (unsigned char*)(pu8Buffer+sizeof(HI_S_AVFrame)) + 4;
    				if(Easy_AACEncoder_Encode(g_pAACEncoderHandle, (unsigned char*)pbuf,  pstruAV->u32AVFrameLen-4, m_pAACEncBufer, &iAACBufferLen) > 0)
    				{
    					avFrame.pBuffer = (Easy_U8*)(m_pAACEncBufer);
    					avFrame.u32AVFrameLen  = iAACBufferLen;	
    					avFrame.u32TimestampSec = pstruAV->u32AVFramePTS/1000;
    					avFrame.u32TimestampUsec = (pstruAV->u32AVFramePTS%1000)*1000;
    					EasyRTMP_SendPacket(g_RtmpHandle, &avFrame);
    				}
    			}		
    		}
    	}
    	else
    	if (u32DataType == HI_NET_DEV_SYS_DATA)
    	{
    		pstruSys = (HI_S_SysHeader*)pu8Buffer;
    		printf("Video W:%u H:%u Audio: %u \n", pstruSys->struVHeader.u32Width, pstruSys->struVHeader.u32Height, pstruSys->struAHeader.u32Format);
    	}
    	return HI_SUCCESS;
    }
    

    获取更多信息

    邮件:support@liveqing.com

    技术交流QQ群:615081503

    咨询电话:15156896292

    LiveQing视频流媒体无插件直播方案:www.liveqing.com

    Copyright © LiveQing Team 2016-2019

  • 相关阅读:
    线程
    管道,数据共享,进程池
    进程锁,队列,JoinableQueue
    网络基础之 并发编程之进程,多路复用,multiprocess模块
    网络基础之 tcp/ip五层协议 socket
    python基础之 026 包以及包的引入
    python基础之 025 模块加载与import的使用
    python基础之正则表达式 re模块
    python基础之 序列 pickle&json
    【SoapUI】SoapUI projects 01
  • 原文地址:https://www.cnblogs.com/kumukim/p/11006674.html
Copyright © 2020-2023  润新知