java jni librtmp_librtmp 编译集成

RTMPDump

RTMPDump 是一个用来处理RTMP流媒体的开源工具包。它能够单独使用进行RTMP的通信,也可以集成到FFmpeg中通过FFmpeg接口来使用RTMPDump。

在Android中可以直接借助NDK在JNI层调用RTMPDump来完成RTMP通信。

在根目录下提供了一个Makefile与一些.c源文件。这里的源文件将会编译出一系列的可执行文件。然后我们需要的并不是可执行文件,真正的对RTMP的实现都在librtmp子目录中。在这个子目录中同样包含了一个Makefile文件。通过阅读Makefile发现,它的源码并不多:OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o。因此我们不进行预编译,即直接放入AS中借助CMakeLists.txt来进行编译。这么做可以让我们方便的对库本身进行调试或修改(实际上我们确实会稍微修改这个库的源码)。

在AS中复制librtmp置于:src/main/cpp/librtmp,并为其编写CMakeLists.txt:

#所有源文件放入 rtmp_source 变量

file(GLOB rtmp_source *.c)

#编译静态库

add_library(rtmp STATIC ${rtmp_source} )

在app/CMakeLists.txt中导入这个CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

#引入指定目录下的CMakeLists.txt

add_subdirectory(librtmp)

#指定头文件查找路径

include_directories(librtmp)

add_library(native-lib SHARED native-lib.cpp)

target_link_libraries(native-lib rtmp log)

尝试编译:

xxx/app/src/main/cpp/librtmp/rtmp.c:40:10: fatal error: 'openssl/ssl.h' file not found

#include

^~~~~~~~~~~~~~~

1 error generated.

问题排查:

打开rtmp.c,我们发现有这里一段宏定义:

#ifdef CRYPTO

#ifdef USE_POLARSSL

#include

#elif defined(USE_GNUTLS)

#include

#else /* USE_OPENSSL */

#include

#include

#endif

TLS_CTX RTMP_TLS_ctx;

#endif

最终只有 CRYPTO 这个宏被定义了才会 #include 。那么我们继续查找 CRYPTO 定义的地方,在 rtmp.h 中又有这样一段:

#if !defined(NO_CRYPTO) && !defined(CRYPTO)

#define CRYPTO

#endif

我们只需要编译时添加定义 NO_CRYPTO 这个预编译宏就可以了。修改 librtmp中的CMakelists.txt:

cmake_minimum_required(VERSION 3.4.1)

#预编译宏

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")

#所有源文件放入 rtmp_source 变量

file(GLOB rtmp_source *.c)

#编译静态库

add_library(rtmp STATIC ${rtmp_source})

输出版本信息,编译测试:

#include

#include

#include

extern "C" JNIEXPORT jstring JNICALL

Java_com_example_pusher_MainActivity_stringFromJNI(

JNIEnv *env,

jobject /* this */) {

std::string hello = "Hello from C++";

char version[100];

sprintf(version, "rtmp version : %d", RTMP_LibVersion());

return env->NewStringUTF(version);

}

输出 rtmp version: 131840,131840 对应的16进制为:0x020300,也就是2.3版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Z-Wave无线技术的指纹锁系统设计

http://www.chinaaet.com/article/218940 摘 要: 结合新兴的低功耗的Z-Wave短距无线通信技术,设计一种应用于酒店的智能指纹锁无线管理与控制系统。该系统的门锁硬件电路包括主控制器S3C2440、指纹采集模块、电机驱动模块及ZM3102无线模块,…

Hibernate一对一关联------主键关联(亲测成功)

1、创建两个实体(Company.java和Login.java)代码如下: 1 package wck.stu.vo.onetoonein;2 3 public class Company {4 private String id "";5 6 private String companyName "";7 8 private Str…

angularjs mysql_AngularJS SQL

AngularJS SQL在前面章节中的代码也可以用于读取数据库中的数据。使用 PHP 从 MySQL 中获取数据AngularJS 实例{{ x.Name }}{{ x.Country }}function customersController($scope,$http) {var site "http://www.w3cschool.cn";var page "/statics/demosource/…

INTEL和AMD两大巨头的前身

仙童半导体公司,曾经是世界上最大、最富创新精神和最令人振奋的半导体生产企业,为硅谷的成长奠定了坚实的基础。更重要的是,这家公司还为硅谷孕育了成千上万的技术人才和管理人才,它不愧是电子、电脑业界的“西点军校”&#xff0…

servlet加载资源两种方式-内外(初始化参数).properties文件

在servlet中加载资源很方便,通过servletContext,这个是web服务器加载完web项目返回的参数之一,还有servletConfig,得到web项目一些配置信息,request和response,等等,我们现在用的这个servletContext也叫做C…

java 登录编程_Java编程通过session访问需要登录的页面

使用Java访问一般网页,进行数据抓取等比较简单,直接用URL和URLConnection连接所需要的网站地址即可,然后对返回的html源码进行处理分析,获取感兴趣的内容。不过如果是需要登录后才能访问的网页就不能直接传入网站url进行连接了&am…

ZDB5202烧成控制器方法

1.跳线和ZDB5202的安装位置如下图 黄色开关设置为off状态,就是靠近班子里面的一方。 2.打开z-wave programmer软件,设置如下图,注意烧写接口为spi,烧写的时候会提示的。选yes是uart,选no是spi。…

判断一个数是不是整数

<?php //判断一个数是整数吗&#xff1f; function check($num){if($num>1){return (check($num-1));//采用递归&#xff0c;一直减到0到1之间}elseif($num<0){return(check((-1)*$num-1));//采用递归&#xff0c;一直减到0到1之间}else{if(($num>0) && (…

z-wave问题汇总

1. 如果发送的串口数据的checksum不对的话&#xff0c;z-wave结点会响应一个0x15。 2. 5202&#xff0c;5101既可以做控制也可以做设备端。他们都是外置天线&#xff0c;距离会好一点。 另外5202和5101也可以做路由结点。 5304只能做控制端&#xff0c;5304的天线是…

java enumeration 排序_Java如何对java.util.Enumeration进行排序?

在此代码段中&#xff0c;您将看到如何对Enumeration对象的内容进行排序。我们首先创建一个随机数并将其存储在中Vector。我们用这些数字&#xff0c;并创建和Enumeration调用对象Vector的elements()方法。我们把它转换为java.util.List&#xff0c;然后排序的内容List使用Coll…

controller配对与接触配对

1&#xff0e; 当点击添加按钮后 以上数据&#xff0c;都是z-wave主控制器与pc controller软件的交换。 2&#xff0e; 当连续点击从结点的配对按钮后。 3&#xff0e; 当点击remove按钮后 4&#xff0e; 当连续点击从结点接触配对按钮后

php可以调用windowsapi吗_2.如何调用WindowsApi

2.如何调用WindowsApi在上一篇章节中 很不专业的介绍了一下WindowsApi 如果你本身就知道 那你也压根不用看 如果你本身就不知道 就算我说的再多 估计你也觉得是多余 所以还是来点实际的首先 在C#中想要调用那些Api(当然不一定是Windows提供的Api) 你得添加一个引用&#xff1a;…

ubuntu 14.04 ssh

使用gedit修改配置文件"/etc/ssh/sshd_config" 打开"终端窗口"&#xff0c;输入"sudo gedit /etc/ssh/sshd_config"-->回车-->把配置文件中的"PermitRootLogin without-password"加一个"#"号,把它注释掉-->再增加一…

php获取跳转后url,php获取跳转后真实url的方法

php获取跳转后真实url的方法发布时间&#xff1a;2020-08-01 14:17:56来源&#xff1a;亿速云阅读&#xff1a;68作者&#xff1a;清晨这篇文章主要介绍php获取跳转后真实url的方法&#xff0c;文中介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们一…

ERROR 1044 (42000): Access denied for user ''@'localhost' to database

用mysqld_saft --skip-grant-tables&启动mysql 然后修改mysql数据库中的user表 将create_priv权限改为Y

php后台无法登入,typecho 后台无法登陆

按照操作说明安装好TYPECHO但是登陆的时候无法进入后台错误提示Warning: include(): Failed opening menu.php for inclusion (include_path.:/opt/php-5.5/pear:/home/u417324844/public_html/Blog/var:/home/u417324844/public_html/Blog/usr/plugins) in /home/u417324844/p…

三、多线程与上厕所

世界上最让人坐立不安&#xff0c;最知道心急的时候&#xff0c;是拿着手纸捂着肚子而厕所里有人的时候。 现在我们有两个人&#xff0c;一个在厕所里&#xff0c;一个在厕所外。 厕所外的人一直问“你好了没&#xff1f;” while&#xff08;厕所里的人没出来&#xff09;{说话…

Ubuntu 14.04 为 root 帐号开启 SSH 登录

1. 修改 root 密码 sudo passwd root2. 以其他账户登录&#xff0c;通过 sudo nano 修改 /etc/ssh/sshd_config : xxxubuntu14:~$ su - root Password: rootubuntu14:~# vi /etc/ssh/sshd_config3. 注释掉 #PermitRootLogin without-password&#xff0c;添加 PermitRootLogi…

定界符在php中,php定界符如何使用

定界符给字符串定界的方法使用定界符语法(“<<结束标识符必须从行的第一列开始。同样&#xff0c;标识符也必须遵循 PHP 中其它任何标签的命名规则&#xff1a;只能包含字母数字下划线&#xff0c;而且必须以下划线或非数字字符开始。举个例子&#xff1a;<?php $str…

IPv6 相关的工作简介

这里说明下&#xff0c;仅仅是IPv6在开发板上的相关的工作简介&#xff0c;没有很详细&#xff0c;都是自己一边积累&#xff0c;一边实践的。能帮助其他人最好&#xff0c;也算是给自己做个备忘录。 一、首先说下DHCPv6相关的。这里我使用的是DHCP6s、DHCP6c&#xff0c;还有好…