EasyRTMP实现将RTSP流转换成RTMP流实现RTSP直播转RTMP直播的功能
本文转自EasyDarwin开源团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52951311
EasyRTMP
EasyRTMP封装了RTMP协议,提供了一套非常简单易用的接口调用SDK,Github上有多个基于EasyRTMP SDK的Demo。Git地址:https://github.com/EasyDarwin/EasyRTMP, Demo中EasyRTMP_RTSP项目是将RTSP流获取到本地进行RTMP推送,可进行RTMP直播。
RTSP视频源进行RTMP直播
目前安防项目上,基本都是RTSP流,无法接入RTMP服务器。
EasyRTMP_RTSP Demo中通过libEasyRTSPClient库将RTSP数据流获取到本地,再讲获取来的音视频数据送给libEasyRTMP进行RTMP推送。如果获取来的数据不是AAC格式,而是G711、G726、PCM等格式,可以使用EasyDarwin团队提供的开源的EasyAACEncoder将音频数据转换成AAC格式再推送。这样可以实现将RTSP视频源实时的进行RTMP协议直播。
/* NVSource从RTSPClient获取数据后回调给上层 */
int Easy_APICALL __RTSPSourceCallBack( int _chid, void *_chPtr, int _mediatype, char *pbuf, RTSP_FRAME_INFO *frameinfo)
{
if (NULL != frameinfo)
{
if (frameinfo->height==1088) frameinfo->height=1080;
else if (frameinfo->height==544) frameinfo->height=540;
}
Easy_Bool bRet = 0;
int iRet = 0;
//目前只处理视频
if (_mediatype == EASY_SDK_VIDEO_FRAME_FLAG)
{
if(frameinfo && frameinfo->length)
{
if( frameinfo->type == EASY_SDK_VIDEO_FRAME_I)
{
if(g_rtmpPusher.rtmpHandle == 0)
{
g_rtmpPusher.rtmpHandle = EasyRTMP_Create();
bRet = EasyRTMP_Connect(g_rtmpPusher.rtmpHandle, SRTMP);
if (!bRet)
{
printf("Fail to EasyRTMP_Connect ...\n");
}
EASY_MEDIA_INFO_T mediaInfo;
memset(&mediaInfo, 0, sizeof(EASY_MEDIA_INFO_T));
mediaInfo.u32VideoFps = 25;
mediaInfo.u32AudioSamplerate = 8000;
iRet = EasyRTMP_InitMetadata(g_rtmpPusher.rtmpHandle, &mediaInfo, 1024);
if (iRet < 0)
{
printf("Fail to InitMetadata ...\n");
}
}
EASY_AV_Frame avFrame;
memset(&avFrame, 0, sizeof(EASY_AV_Frame));
avFrame.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;
avFrame.u32AVFrameLen = frameinfo->length;
avFrame.pBuffer = (unsigned char*)pbuf;
avFrame.u32VFrameType = EASY_SDK_VIDEO_FRAME_I;
avFrame.u32TimestampSec = frameinfo->timestamp_sec;
avFrame.u32TimestampUsec = frameinfo->timestamp_usec;
iRet = EasyRTMP_SendPacket(g_rtmpPusher.rtmpHandle, &avFrame);
if (iRet < 0)
{
printf("Fail to EasyRTMP_SendH264Packet(I-frame) ...\n");
}
else
{
printf("I");
}
}
else
{
if(g_rtmpPusher.rtmpHandle)
{
EASY_AV_Frame avFrame;
memset(&avFrame, 0, sizeof(EASY_AV_Frame));
avFrame.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG;
avFrame.u32AVFrameLen = frameinfo->length-4;
avFrame.pBuffer = (unsigned char*)pbuf+4;
avFrame.u32VFrameType = EASY_SDK_VIDEO_FRAME_P;
avFrame.u32TimestampSec = frameinfo->timestamp_sec;
avFrame.u32TimestampUsec = frameinfo->timestamp_usec;
iRet = EasyRTMP_SendPacket(g_rtmpPusher.rtmpHandle, &avFrame);
if (iRet < 0)
{
printf("Fail to EasyRTMP_SendH264Packet(P-frame) ...\n");
}
else
{
printf("P");
}
}
}
}
}
else if (_mediatype == EASY_SDK_AUDIO_FRAME_FLAG)
{
EASY_AV_Frame avFrame;
memset(&avFrame, 0x00, sizeof(EASY_AV_Frame));
avFrame.u32AVFrameFlag = EASY_SDK_AUDIO_FRAME_FLAG;
avFrame.u32TimestampSec = frameinfo->timestamp_sec;
avFrame.u32TimestampUsec = frameinfo->timestamp_usec;
if(frameinfo->codec == EASY_SDK_AUDIO_CODEC_AAC)
{
avFrame.pBuffer = (Easy_U8*)(pbuf);
avFrame.u32AVFrameLen = frameinfo->length;
printf("*");
iRet = EasyRTMP_SendPacket(g_rtmpPusher.rtmpHandle, &avFrame);
}
else if ((frameinfo->codec == EASY_SDK_AUDIO_CODEC_G711A) || (frameinfo->codec == EASY_SDK_AUDIO_CODEC_G711U) || (frameinfo->codec == EASY_SDK_AUDIO_CODEC_G726))
{
if(EasyInitAACEncoder(frameinfo) == 0)
{
memset(g_rtmpPusher.m_pAACEncBufer, 0, 64*1024);
unsigned int iAACBufferLen = 0;
if(Easy_AACEncoder_Encode(g_rtmpPusher.m_pAACEncoderHandle, (unsigned char*)pbuf, frameinfo->length, g_rtmpPusher.m_pAACEncBufer, &iAACBufferLen) > 0)
{
printf("*");
avFrame.pBuffer = (Easy_U8*)(g_rtmpPusher.m_pAACEncBufer);
avFrame.u32AVFrameLen = iAACBufferLen;
iRet = EasyRTMP_SendPacket(g_rtmpPusher.rtmpHandle, &avFrame);
}
}
}
}
return 0;
}
获取更多信息
Copyright © EasyDarwin.org 2012-2016

EasyRTMP实现将RTSP流转换成RTMP流实现RTSP直播转RTMP直播的功能的更多相关文章
- java中如何把图片转换成二进制流的代码
在学习期间,把开发过程经常用到的一些代码段做个备份,下边代码内容是关于java中如何把图片转换成二进制流的代码,应该能对各朋友也有用处. public byte[] SetImageToByteArr ...
- 75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)
转换流: InputStreamReader 输入字节流转换成输入字符流OutputStreamWriter 输出字节流转换成输出字符流 总结:就是字节流转换成字符流,但是不能字节流转换成字节流 ...
- 将一个读取流转换成bitmap对象
将一个读取流转换成bitmap对象: BitmapFactory:可以将文件,读取流,字节数组转换成一个Bitmap对象. Bitmap bitmap = Bitma ...
- C#图片转换成二进制流并且保存到sql server数据库
注意:我要存储文件二进制流的列的类型是text,不是image类型. 我已经实现了从数据库中读取text类型的二进制流,,现在就是不知道怎么存进去. 我的部分关键代码: StreamReader sr ...
- 直接将视频文件原码流转换成YUV,输出到屏幕显示
#include "stdafx.h" #define inline _inline#ifndef INT64_C#define INT64_C(c) (c ## LL)#defi ...
- vue文件流转换成pdf预览(pdf.js+iframe)
参考文档:https://www.jianshu.com/p/242525315bf6 PDFJS: https://mozilla.github.io/pdf.js/ 支持获取文件流到客户端 ...
- net9:图片文件转换成二进制流存入SQL数据库,以及从数据库中读取二进制流输出文件
原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- Android将图像转换成流存储与将流转换成图像
1.将图片转换成二进制流 public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutputStream out = new ByteArrayOu ...
- IO流--流转换
import java.io.*; //键盘读入 字节流转换成字符流操作 提高效率 public class io { public static void main(String[] args) t ...
随机推荐
- Best Coder Lotus and Characters
Lotus and Characters 问题描述 Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的串. 定义串的价值为:第1位字母的价值*1+第2位字母的 ...
- 切換 java compiler 版本
有些程式在執行時會顯示需要較新的 java jre 版本, 若系統裝有兩個 java jre 可以使用下列指令切協版本, sudo update-alternatives --config java ...
- C/C++程序编译运行过程分析(转载)
为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母.符号串来替代一个特定的指令的二进制串,比如,用“A D D”代表加法,“M O V”代表数据传递等等,这样一来,人们很容 ...
- OS | monolithic kernel & microkernel
A monolithic kernel is a kernel where all services (file system, VFS, device drivers, etc) as well a ...
- javascript --- 原型继承与属性拷贝的综合应用
对于继承来说,主要目标就是将一些现有的功能据为己有.也就是说,我们在新建一个对象的时候,通常首先继承现有对象,然后再为其添加额外的属性和方法. 对此,我们可以通过一个函数调用来完成. 具体而言就是: ...
- springboot配置filter
Filter 过滤器是web开发中很重要的一个组件,下面以一个session登陆的例子介绍下spring boot中如何使用Filter 首先要准备一个实现了Filter的接口的类 SessionFi ...
- sublime text 3和sublime text 2的 package control 插件 代码
SECURITY NOTICE: The Python code used by this method does not use SSL because Sublime Text on Linux ...
- JavaScript中的Math方法演示
<html> <head> <script type="text/javascript"> var num = 12.4; alert(Math ...
- Highcharts常用的最核心的参数选项配置详细说明
Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...
- mysql:“Access denied for user 'root@IP地址'"
请仔细.再仔细确认你的用户名.密码.IP是否有误! 可悲的我老犯这种低级错误,以为用户没权限访问,唉..