RTMPDump主页 ,RTMPDump库主要包含三部分:

1、一个基本的客户端程序

2、两个服务器程序(rtmpsrv、rtmpsuck)

3、一个支持rtmp协议的库—librtmp

下载RTMPDump最新源码,可以通过git拉取master分支上的最新代码:

  1. git clone git://git.ffmpeg.org/rtmpdump

或者下载以前版本的代码— Download old version

下面主要介绍librtmp和librtmp的编译

librtmp概述

librtmp库提供了大量客户端函数和少部分的服务器端的函数用来支持RTMP、RTMPT(RTMP使用Http通道),RTMPE(加密的RTMP),RTMPS(基于SSL/TLS的RTMP)和RTMPTE、RTMPTS(使用Http通道的加密和基于SSL/TLS的RTMP)协议

使用librtmp库进行的流媒体交互都是使用 FLV 封包格式进行传输的,当然编码不限定,不过为了拉流端同时也支持 HLS 协议,最好使用 H264 编码视频和 AAC 编码音频数据

使用librtmp通过 RTMP[T][E|S] 协议进行一次流媒体交互的基本过程为:

推流端:

  1. RTMP_Alloc() -创建一个RTMP会话句柄
  2. RTMP_Init() -初始化RTMP句柄
  3. RTMP_SetupURL() -设置推流RTMP Url
  4. RTMP_EnableWrite() -配置该媒体流可进行写操作
  5. RTMP_Connect() -建立RTMP网络连接
  6. RTMP_ConnectStream() -建立RTMP流连接
  7. RTMP_Write() -对该媒体流进行写入流媒体信息
  8. RTMP_Close() -关闭RTMP连接
  9. RTMP_Free() -释放此次连接的会话句柄

播放端:

  1. RTMP_Alloc() -创建一个RTMP会话句柄
  2. RTMP_Init() -初始化RTMP句柄
  3. RTMP_SetupURL() -设置拉流RTMP Url
  4. RTMP_Connect() -建立RTMP网络连接
  5. RTMP_ConnectStream() -建立RTMP流连接
  6. RTMP_Read() -读取媒体流数据,返回0时则媒体流读取完毕
  7. RTMP_Pause() -暂停读取媒体流数据或取消暂停(options)
  8. RTMP_Seek() -可通过它改变流播放的位置(options)
  9. RTMP_Close() -当媒体流读取完毕后进行RTMP连接的关闭
  10. RTMP_Free() -释放此次连接的会话句柄

上述方法的具体实现可以在librtmp包中的 rtmp.c 文件中找到,同时,它还提供了其它众多方法来处理RTMP的流媒体交互过程

librtmp的RTMP URL格式

一个基本的RTMP URL格式为:

  1. rtmp[t][e|s]://host[:port][/app[/playpath]]

和http类似,不过某些地方不一样,下面简单说说:

scheme为rtmp或者rtmp协议的诸多变种之一,这就不需要多解释了,像websocket协议scheme为ws或者wss,http协议scheme为http或https。

host为主机名,后面紧接着为端口号,如果不指定,rtmp协议默认端口号为1935.

app代表服务器上的一个Application应用程序,这个名称是由服务器定义的,如:live。

playpath则是表示该Application下的一个媒体流的路径,如:room100。

当然也可以追加额外的参数,只不过这和我们使用http协议追加参数的方式不同,librtmp是采取空格为分隔符,通过追加”key=value”的方式进行追加额外的参数,如:

  1. "rtmp://localhost:1935/live/room100 app=happylive"

这就追加了额外的key为app,value为happylive的参数,表示使用happylive应用来连接而代替rtmp url中的live应用

关于librtmp的更多额外的参数配置,可以看 librtmp文档

librtmp编译

由于librtmp默认依赖zlib和openssl这两个库,所以编译时需要链接这两个库,由于NDK自带了zlib库,所以不需要单独去下载和编译,在编译librtmp时配置 Android.mk 文件的 LOCAL_LDLIBS 属性为 -lz 链接即可,编译时会在指定的platforms的arch-xxx/usr/lib/目录下搜索

编译librtmp,在librtmp目录下新建Android.mk文件,内容如下:

  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3.  
  4. # 编译模块输出的名称
  5. LOCAL_MODULE := rtmp
  6.  
  7. # 编译所需的头文件路径
  8. LOCAL_C_INCLUDES += \
  9. $(LOCAL_PATH)/
  10. #$(LOCAL_PATH)/../openssl/include/ #链接openssl库
  11.  
  12. # 编译所需的源文件路径
  13. LOCAL_SRC_FILES := \
  14. amf.c \
  15. log.c \
  16. parseurl.c \
  17. rtmp.c \
  18. hashswf.c
  19.  
  20. # 编译时候需要链接的动态库库存在静态库形式,将会链接到对应的静态库而不是动态库
  21. # LOCAL_FORCE_STATIC_EXECUTABLE := true
  22.  
  23. # 添加编译配置选项,一些常用编译配置:
  24. # -fPIC:编译位置无关的代码,一般用于编译动态库
  25. # -02:编译优化程度
  26. # -lxxx:链接名为libxxx库
  27. # -I添加编译器搜索-l指定的库文件的搜索
  28. # -D:加入宏定义,如:NO_CRYPTO,不使用加密
  29. LOCAL_CFLAGS += -DRTMPDUMP_VERSION=v2.4 -DNO_CRYPTO -Wall -fPIC -O2
  30. #LOCAL_CFLAGS += -I$(LOCAL_PATH)/../openssl -lssl -lcrypto #可选添加openssl支持,需去除-DNO_CRYPTO
  31.  
  32. # 添加编译时需要链接器链接的那些存在于NDK目录下的其它库,所链接库的以“-lxxx”格式命名,如:-lz 表示编译时会加载libz.so库
  33. LOCAL_LDLIBS += -lz
  34.  
  35. # include $(BUILD_STATIC_LIBRARY)
  36. include $(BUILD_SHARED_LIBRARY)

关于mk文件的编写和参数配置,可以阅读 mk官网文档 ,上面也给出了全部编译时参数配置的注释,由于上面配置加入了 NO_CRYPTO 定义,没有链接openssl库,需要的可以自己加或者使用 PolarSSL 、GnuTLS 来替代 OpenSSL

然后在rtmpdump目录下也建立个Android.mk文件,内容为:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
  4. librtmp \
  5. ))
  6. include $(subdirs)

其实不需要这个也行,不过加入该文件目的是为了能够统一rtmpdump文件夹下和子目录中的mk的编译运行入口,这样只需调用这一个mk文件即可,上面配置的只会运行librtmp目录下的mk文件,如果需要加入其它的,则在 subdirs 中加入即可,如:

  1. subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
  2. librtmp \
  3. otherdir \
  4. ))

最后在rtmpdump中新建jni目录,新建Application.mk文件,内容为:

  1. NDK_TOOLCHAIN_VERSION := 4.9
  2. APP_PLATFORM := android-14
  3. APP_ABI := all
  4. APP_OPTIM := release
  5. APP_PROJECT_PATH := $(shell pwd)
  6. APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk

主要是对编译时的编译配置进行配置, APP_ABI := all 表示支持当前平台支持的的全部CPU架构

然后新建一个开始执行编译的脚本文件,内容为:

  1. #!/bin/bash
  2. NDK=$HOME/Library/Android/sdk/ndk-bundle
  3. $NDK/ndk-build NDK_APPLICATION_MK=./jni/Application.mk NDK_PROJECT_PATH=./

其中NDK路径替换为自己的即可,开始编译:

  1. cd rtmpdump
  2. ./build_librtmp.sh

成功后,可以在rtmpdump目录下看到obj和libs两个文件夹,libs存放着编译出来的动态库,而obj则是存放静态库,这取决于所配置的是 BUILD_SHARED_LIBRARY 还是 BUILD_STATIC_LIBRARY

当然其它库也可以用这种方式进行编译

编译支持librtmp的FFmpeg动态链接库

由于FFmpeg本身默认自带就支持rtmp、rtmpt协议,不过也可以扩展以便支持rtmp协议的多种变种协议(rtmps、rtmpt、rtmpts、rtmpte和rtmpe协议),在FFmpeg加入openssl库的支持,可以支持rtmps、rtmpts协议,加入libgcrypt库的支持,可以支持rtmpe、rtmpte协议,这样支持相对麻烦,可以直接使用librtmp来支持rtmp以及它的多种变种协议,可通过链接librtmp库来支持

简述RTMPDump与编译移植的更多相关文章

  1. Linux编译移植Qt5的环境_OMAPL138平台

    Linux编译移植Qt5_OMAPL138 [导语]:昨天编译Qt5各种失败,各种离奇的错误在Google上面也搜索不到,真是让人"蛋疼菊紧",今天把所有的环境全部清理干净,也重新 ...

  2. Linux编译移植Qt4的环境_在OMAPL138平台

    Linux编译Qt4的环境_OMAPL138 手里有一块创龙OMAPL138的板子,我要在上面成功移植Qt环境和触摸屏幕,这是我第二次进行Linux的Qt环境移植,发现了很多问题,需要重新整理. 我编 ...

  3. Linux编译移植Qt5的环境_Xillinx的ZYNQ平台

    Linux编译Qt环境 2017年的十一假期,足不出户,一个人在教研室里面搞Qt的移植.我手里面有Samsung的CortexA8,Samsung的 CortexA53还有Ti的Sitara系列的AM ...

  4. Boa服务器编译移植

    Boa服务器移植 Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右.作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求.但Boa支 ...

  5. strace调试工具编译移植

     源码下载:https://github.com/strace/strace/releases/tag/v4.18(使用的较老版本,最新版 5.4 编译时依赖较多,最终博主放弃使用) [ 编译步骤 ] ...

  6. Qt 5.8 移植编译、测试

    /****************************************************************************** * Qt 5.8 移植编译.测试 * 说 ...

  7. 【OK210试用体验】进阶篇(2)视频图像采集之MJPG-streamer编译(arm移植)

    上一篇([OK210试用体验]进阶篇(1)视频图像采集之MJPG-streamer编译(Ubuntu系统下))进行了MJPG-streamer在Ubuntu下的编译及测试,这一篇针对OK210,进行a ...

  8. Curl的移植编译以及注意事项

    最近需要用curl来发送http请求,遇到了不少问题,查了不少资料,都是零零散散的,现在总结下.   1.移植编译 ./configure --prefix=$(PWD)/build --host=a ...

  9. Qt4.8.5在ARM9上的移植

    Qt4.8.5在ARM9开发板上的移植 以前移植过qtopia-embedded-2.2.0,俗称Qt/E,在早期的Qt框架中是使用X11桌面服务器系统,无法应用于嵌入式平台,为此产生了qtopia, ...

随机推荐

  1. python os os.path模块学习笔记

    #!/usr/bin/env python #coding=utf-8 import os #创建目录 os.mkdir(r'C:\Users\Silence\Desktop\python') #删除 ...

  2. 【Flutter学习】基本组件之AppBar顶部导航栏

    一,概述 AppBar 显示在app的顶部.AppBar包含5大部分,如下图: 二,构造函数及参数含义 构造函数 AppBar({ Key key, this.leading, //在标题前面显示的一 ...

  3. Python编码格式导致的csv读取错误

    Python编码格式导致的csv读取错误(pandas.read_csv) 本文记录python小白我今天遇到的这两个问题(csv.reader和pandas.csv_read): pandas模块“ ...

  4. js 图表转图片

    最近项目上有个需求,是将一些teechart做的图表转换成图片插入自动生成的PDF里,Teechart绘图和如何生成PDF这些这里就不说了,这个任务比较别扭的一点是,图表自动生成,且整个过程中页面不能 ...

  5. UVALive 3026(KMP算法)

    UVALive 3026     KMP中next[]数组的应用: 题意:给出一个字符串,问该字符串每个前缀首字母的位置和该前缀的周期. 思路:裸KMP直接上就是了: 设该字符串为str,str字符串 ...

  6. 使用vscode,新建.vue文件,tab自动生成vue代码模板

    第一步: 新建模板并保存 文件 --> 首选项 --> 用户代码片段 --> 输入vue,选择vue.json -->复制 第三步中的模板内容中内容保存 第二步: 添加配置,让 ...

  7. Windows环境下flask+Apache+mod_wsgi部署及爬坑

    文章目录 安装python Windows 环境使用virtualenv和virtualenvwrapper 安装mod_wsgi 安装nginx 安装Apache 遇到的坑 安装Apache遇到的坑 ...

  8. 学习记录--如何将exec执行结果放入变量中?

    declare @num int, ) set @sqls='select @a=count(*) from tb ' exec sp_executesql @sqls,N'@a int output ...

  9. 【codeforces 767B】The Queue

    [题目链接]:http://codeforces.com/contest/767/problem/B [题意] 排队去办护照; 给你n个人何时来的信息; 然后问你应该何时去才能在队伍中等待的时间最短; ...

  10. Java多线程之如何确定线程数

    关于多线程的线程数的确定,最近研读过几篇paper,在此做一下笔记,方便使用时翻看. 1.<Java 虚拟机并发编程>中介绍 就是说:线程数 =  CPU的核心数 * (1 - 阻塞系数) ...