本文转自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;
}

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2016

EasyRTMP实现将RTSP流转换成RTMP流实现RTSP直播转RTMP直播的功能的更多相关文章

  1. java中如何把图片转换成二进制流的代码

    在学习期间,把开发过程经常用到的一些代码段做个备份,下边代码内容是关于java中如何把图片转换成二进制流的代码,应该能对各朋友也有用处. public byte[] SetImageToByteArr ...

  2. 75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)

    转换流: InputStreamReader   输入字节流转换成输入字符流OutputStreamWriter  输出字节流转换成输出字符流 总结:就是字节流转换成字符流,但是不能字节流转换成字节流 ...

  3. 将一个读取流转换成bitmap对象

     将一个读取流转换成bitmap对象:         BitmapFactory:可以将文件,读取流,字节数组转换成一个Bitmap对象.         Bitmap bitmap = Bitma ...

  4. C#图片转换成二进制流并且保存到sql server数据库

    注意:我要存储文件二进制流的列的类型是text,不是image类型. 我已经实现了从数据库中读取text类型的二进制流,,现在就是不知道怎么存进去. 我的部分关键代码: StreamReader sr ...

  5. 直接将视频文件原码流转换成YUV,输出到屏幕显示

    #include "stdafx.h" #define inline _inline#ifndef INT64_C#define INT64_C(c) (c ## LL)#defi ...

  6. vue文件流转换成pdf预览(pdf.js+iframe)

    参考文档:https://www.jianshu.com/p/242525315bf6 PDFJS: https://mozilla.github.io/pdf.js/     支持获取文件流到客户端 ...

  7. net9:图片文件转换成二进制流存入SQL数据库,以及从数据库中读取二进制流输出文件

    原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  8. Android将图像转换成流存储与将流转换成图像

    1.将图片转换成二进制流 public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutputStream out = new ByteArrayOu ...

  9. IO流--流转换

    import java.io.*; //键盘读入 字节流转换成字符流操作 提高效率 public class io { public static void main(String[] args) t ...

随机推荐

  1. Linux System Programming 学习笔记(九) 内存管理

    1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系 ...

  2. FZOJ Problem 2107 Hua Rong Dao

                                                                                                        ...

  3. 应用defineProperty简单实现vue的双向数据绑定

    双向数据绑定简易版本如何应用defineProperty的getter setter 方法 有这样HTML片段 <input type="text" id="dem ...

  4. Android系统默认语言改为中文

    第一种方法: 修改 build/tools/buildinfo.sh echo "ro.product.locale.language=zh"echo "ro.produ ...

  5. (2)html 块类

    span span是内联元素,内联元素的特点:在显示时通常不会以新行开始 div div是块级元素,块级元素会换新行 class 设置 <head> <style> .citi ...

  6. Usaco_Contest_2013_Open_Bovine Problem 1. Bovine Ballet

    Problem 1: Bovine Ballet [Brian Dean, 2013] In an attempt to challenge the stereotypical perception ...

  7. Java ArrayList 详解

    只记录目前为止关注的.JDK1.8 一.基础属性 1.1 内部参数 //空存储实例.直接new ArrayList()便是以该空数组作为实例 private static final Object[] ...

  8. mybatis-plus generator template 中的全部属性

    { "date": "2018-10-30", "superServiceImplClassPackage": "com.baom ...

  9. Java RSA 加密 解密 签名 验签

    原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...

  10. OpenGL step to step(2)

    这是一个类似于地球绕太阳旋转的demo 原有的例子是用键盘接受事件,我做了修改,使用了timer把他变成一个动态旋转的 #import <Foundation/Foundation.h> ...