EasyHLS实现将IPCamera摄像机的RTSP流转成HLS(ts+m3u8)直播输出
本文转自:http://www.cnblogs.com/babosa/p/6033039.html
EasyHLS
EasyHLS是EasyDarwin开源流媒体团队开发的一款HLS打包库,接口非常简单,只需要传入打包的文件名、切片存放的目录、单个切片时长以及切片数等参数,EasyHLS库就能轻松将H264+AAC的流媒体切片成m3u8+ts,提供给WEB服务器进行HLS流媒体发布;
调用流程

/* 打包H264视频 */
EasyHLS_API int Easy_APICALL EasyHLS_VideoMux(Easy_HLS_Handle handle, unsigned int uiFrameType, unsigned char *data, int dataLength, unsigned long long pcr, unsigned long long pts, unsigned long long dts); 其中pcr、dts、pts等参数都是unsigned long long型,通常情况下为时间戳(ms毫秒)\*90以后的结果,所以我们通常需要定义:
unsigned long long pcr,dts,pts = timestamp\*90; 千万不要定义unsigned int型接收数据输入!具体过程参考上面的几个示例;
EasyHLS_RTSP
EasyHLS_RTSP程序可以通过RTSPClient将RTSP摄像机IPCamera的流媒体音视频数据流获取到本地,再进行ts的音视频封装打包,并不断更新m3u8列表,以提供HLS直播功能:
Easy_HLS_Handle fHLSHandle = 0;
Easy_RTSP_Handle fRTSPHandle = 0;
/* RTSPClient获取数据后回调给上层 */
int Easy_APICALL __RTSPClientCallBack( int _chid, void *_chPtr, int _frameType, char *_pBuf, RTSP_FRAME_INFO *_frameInfo)
{
if(NULL == fHLSHandle) return -1;
if (_frameType == EASY_SDK_VIDEO_FRAME_FLAG)
{
unsigned long long llPTS = (_frameInfo->timestamp_sec%1000000)*1000 + _frameInfo->timestamp_usec/1000;
printf("Get %s Video \tLen:%d \ttm:%u.%u \t%u\n",_frameInfo->type==EASY_SDK_VIDEO_FRAME_I?"I":"P", _frameInfo->length, _frameInfo->timestamp_sec, _frameInfo->timestamp_usec, llPTS);
unsigned int uiFrameType = 0;
if (_frameInfo->type == EASY_SDK_VIDEO_FRAME_I)
{
uiFrameType = TS_TYPE_PES_VIDEO_I_FRAME;
}
else if (_frameInfo->type == EASY_SDK_VIDEO_FRAME_P)
{
uiFrameType = TS_TYPE_PES_VIDEO_P_FRAME;
}
EasyHLS_VideoMux(fHLSHandle, uiFrameType, (unsigned char*)_pBuf, _frameInfo->length, llPTS*90, llPTS*90, llPTS*90);
}
else if (_frameType == EASY_SDK_AUDIO_FRAME_FLAG)
{
unsigned long long llPTS = (_frameInfo->timestamp_sec%1000000)*1000 + _frameInfo->timestamp_usec/1000;
printf("Get Audio \tLen:%d \ttm:%u.%u \t%u\n", _frameInfo->length, _frameInfo->timestamp_sec, _frameInfo->timestamp_usec, llPTS);
if (_frameInfo->codec == EASY_SDK_AUDIO_CODEC_AAC)
{
EasyHLS_AudioMux(fHLSHandle, (unsigned char*)_pBuf, _frameInfo->length, llPTS*90, llPTS*90);
}
}
else if (_frameType == EASY_SDK_EVENT_FRAME_FLAG)
{
if (NULL == _pBuf && NULL == _frameInfo)
{
printf("Connecting:%s ...\n", ConfigRTSPURL);
}
else if (NULL!=_frameInfo && _frameInfo->type==0xF1)
{
printf("Lose Packet:%s ...\n", ConfigRTSPURL);
}
}
return 0;
}
void PrintUsage()
{
printf("Usage:\n");
printf("------------------------------------------------------\n");
printf("%s [-c <PlayListCapacity> -C <AllowCache> -v <M3U8Version> -t <TargetDuration> -d <HLSRootDir> -n <HLSessionName> -u <RTSPURL> -U <HttpRootUrl>]\n", ProgName);
printf("Help Mode: %s -h \n", ProgName );
printf("For example: %s -c 4 -C 0 -v 3 -t 4 -d ./ -n easyhls_rtsp -u rtsp://admin:admin@anfengde.f3322.org/22 -U http://www.easydarwin.org/easyhls/\n", ProgName);
printf("------------------------------------------------------\n");
}
int main(int argc, char * argv[])
{
#ifdef _WIN32
extern char* optarg;
#endif
int ch;
ProgName = argv[0];
PrintUsage();
while ((ch = getopt(argc,argv, "hc:C:v:t:d:n:u:U:")) != EOF)
{
switch(ch)
{
case 'h':
PrintUsage();
return 0;
break;
case 'c':
ConfigPlayListCapacity =atoi(optarg);
break;
case 'C':
ConfigAllowCache =atoi(optarg);
break;
case 'v':
ConfigM3U8Version =atoi(optarg);
break;
case 't':
ConfigTargetDuration =atoi(optarg);
break;
case 'd':
ConfigHLSRootDir =optarg;
break;
case 'n':
ConfigHLSessionName =optarg;
break;
case 'u':
ConfigRTSPURL =optarg;
break;
case 'U':
ConfigHttpRootUrl =optarg;
break;
case '?':
return 0;
break;
default:
break;
}
}
int isEasyHLSActivated = EasyHLS_Activate(KEY);
switch(isEasyHLSActivated)
{
case EASY_ACTIVATE_INVALID_KEY:
printf("EasyHLS_KEY is EASY_ACTIVATE_INVALID_KEY!\n");
break;
case EASY_ACTIVATE_TIME_ERR:
printf("EasyHLS_KEY is EASY_ACTIVATE_TIME_ERR!\n");
break;
case EASY_ACTIVATE_PROCESS_NAME_LEN_ERR:
printf("EasyHLS_KEY is EASY_ACTIVATE_PROCESS_NAME_LEN_ERR!\n");
break;
case EASY_ACTIVATE_PROCESS_NAME_ERR:
printf("EasyHLS_KEY is EASY_ACTIVATE_PROCESS_NAME_ERR!\n");
break;
case EASY_ACTIVATE_VALIDITY_PERIOD_ERR:
printf("EasyHLS_KEY is EASY_ACTIVATE_VALIDITY_PERIOD_ERR!\n");
break;
case EASY_ACTIVATE_SUCCESS:
printf("EasyHLS_KEY is EASY_ACTIVATE_SUCCESS!\n");
break;
}
if(EASY_ACTIVATE_SUCCESS != isEasyHLSActivated)
return -1;
if( EASY_ACTIVATE_SUCCESS != EasyRTSP_Activate(EasyRTSPClient_KEY))
return -1;
//创建EasyRTSPClient
EasyRTSP_Init(&fRTSPHandle);
if (NULL == fRTSPHandle) return 0;
unsigned int mediaType = EASY_SDK_VIDEO_FRAME_FLAG | EASY_SDK_AUDIO_FRAME_FLAG;
//设置数据回调处理
EasyRTSP_SetCallback(fRTSPHandle, __RTSPClientCallBack);
//打开RTSP流
EasyRTSP_OpenStream(fRTSPHandle, 0, ConfigRTSPURL, EASY_RTP_OVER_TCP, mediaType, 0, 0, NULL, 1000, 0, 0x01, 1);
//创建EasyHLS Session
fHLSHandle = EasyHLS_Session_Create(ConfigPlayListCapacity, ConfigAllowCache, ConfigM3U8Version);
char subDir[64] = { 0 };
sprintf(subDir,"%s/",ConfigHLSessionName);
EasyHLS_ResetStreamCache(fHLSHandle, ConfigHLSRootDir, subDir, ConfigHLSessionName, ConfigTargetDuration);
printf("HLS URL:%s%s/%s.m3u8\n", ConfigHLSRootDir, ConfigHLSessionName, ConfigHLSessionName);
printf("Press Enter exit...\n");
getchar();
EasyHLS_Session_Release(fHLSHandle);
fHLSHandle = 0;
EasyRTSP_CloseStream(fRTSPHandle);
EasyRTSP_Deinit(&fRTSPHandle);
fRTSPHandle = NULL;
return 0;
}
详细代码下载:https://github.com/EasyDarwin/EasyHLS
获取更多信息
Author:Jason
QQ交流群:532837588
Copyright © EasyDarwin.org 2012-2016

EasyHLS实现将IPCamera摄像机的RTSP流转成HLS(ts+m3u8)直播输出的更多相关文章
- EasyHLS实现将IPCamera摄像机的RTSP转HLS直播输出
EasyHLS EasyHLS是EasyDarwin开源流媒体团队开发的一款HLS打包库,接口非常简单,只需要传入打包的文件名.切片存放的目录.单个切片时长以及切片数等参数,EasyHLS库就能轻松将 ...
- ffmpeg+nginx+video实现rtsp流转hls流,通过H5查看监控视频
一.FFmpeg下载:http://ffmpeg.zeranoe.com/builds/ 下载并解压FFmpeg文件夹,配置环境变量:在“Path”变量原有变量值内容上加上d:\ffmpeg\bin, ...
- [转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
[转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357 RTP ...
- 流媒体协议(RTMP、RTSP、UDP、HTTP、MMS)转换小工具(RTSP转成RTMP案例展示)(转)
源: 流媒体协议(RTMP.RTSP.UDP.HTTP.MMS)转换小工具(RTSP转成RTMP案例展示)
- C#图片转成流,流转成图片,字节转图片,图片转字节的方法
图片转成流 Bitmap b = new Bitmap(Server.MapPath(ppath)); Stream ms = new MemoryStream(); b.Save(ms, Syste ...
- 实现RTSP摄像机硬盘录像机NVR网站网页微信H5直播方案EasyNVR部署问题之:ERR_CONTENT_LENGTH_MISMATCH
背景分析 接触到EasyNVR产品的开发者都知道,EasyNVR是一套功能齐全.简洁易用的流媒体解决方案,可作为能力曾前端接入摄像头,后端接入业务系统使用,也可以作为应用层,直接修改为属于企业用户自己 ...
- 内网网络摄像机(RTSP/IPC/NVR)如何能在公网进行RTMP/HLS/HTTP-FLV直播
一.背景需求 传统监控行业里不管是设备端.服务器端亦或是客户端都在一个内网里面.而且现在的大部分监控方案都是这样的格局,小到一个公司范围内的监控,再到一个园区.一个仓库监控.一个农业园林监控.一个养殖 ...
- 通用安防摄像机通过RTSP转RTMP推流进行H5(RTMP/HLS)直播的方案
EasyNVR摄像机无插件直播方案 随着互联网的发展,尤其是移动互联网的普及,基于H5.微信的应用越来越多,企业也更多地想基于H5.微信公众号来快速开发和运营自己的视频及视频相关性产品,那么传统的安防 ...
- EasyNVR RTSP转HLS(m3u8+ts)流媒体服务器前端构建之:bootstrap-datepicker日历插件的实时动态展现
EasyNVR中有对录像进行检索回放的功能,且先抛开录像的回放,为了更好的用户体验过.让用户方便快捷的找到对应通道对应日期的录像视频,是必须的功能. 基于上述的需求,为前端添加一个日历插件,在日历上展 ...
随机推荐
- Atcoder CODE FESTIVAL 2017 qual B E - Popping Balls 组合计数
题目链接 题意 \(A+B\)个球排成一行,左边\(A\)个为红球,右边\(B\)个为蓝球. 最开始可以选择两个数\(s,t\),每次操作可以取左起第\(1\)或\(s\)或\(t\)个球.问有多少种 ...
- 系统虚拟内存的理解 转载自http://blog.csdn.net/do2jiang/article/details/4690967
在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序 ...
- Linux 之 LNMP服务器搭建-MySQL
LNMP服务器搭建-MySQL 参考教程:[千峰教育] 系统版本: CentOS 6.8 关闭防火墙和Selinux service iptables stop setenforce 0 安装mysq ...
- AC日记——爱改名的小融3 codevs 3156
3156 爱改名的小融 3 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Wikioi上有个人叫小融,他喜 ...
- HDU 5733 tetrahedron(计算几何)
题目链接 tetrahedron 题目大意 输入一个四面体求其内心,若不存在内心则输出"O O O O" 解题思路 其实这道题思路很简单,只要类推一下三角形内心公式就可以了. 至于 ...
- OceanBase数据库实践入门——手动搭建OceanBase集群
前言 目前有关OceanBase功能.案例.故事的文章已经很多,对OceanBase感兴趣的朋友都想安装一个数据库试试.本文就是分享初学者如何手动搭建一个OceanBase集群.这也是学习理解Ocea ...
- CDOJ_327 BerOS file system
原题地址:http://acm.uestc.edu.cn/#/problem/show/327 The new operating system BerOS has a nice feature. I ...
- [影像技术与PACS] 从技术角度看国内部份PACS厂商
天健PACS较早从事影像医院处理系统,为国外系统或设备以OEM方式提供软件模块.天健的PACS里面三维重建.容积重建.血管分析.虚拟腔镜.头部灌注等部分是用西安盈谷科技的,手术麻醉和重症监护系统是奥迪 ...
- 杂谈之WEB前端project师身价
了解javascript语言规范么?+1000 知道各浏览器的css差异么?+1000 javascript差异呢?+1000 知道html各标签的含义并不是常好地运用么?+1000 知道怎样跨浏览器 ...
- 用 Sencha Touch 构建移动 web 应用程序
Sencha Touch 是一个使用 HTML5.CSS3 和 JavaScript 语言构建的移动 web 应用程序框架,在本文中,学习如何应用您当前的 web 开发技能进行移动 web 开发.下载 ...