​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2  FFmpeg向网络推流”介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。可是在此之前,得先有一个推流工具向MediaMTX推送视频流,这样末端的拉流程序才能从MediaMTX源源不断地拉取视频流。那么Android手机可使用librestreaming从摄像头实时采集视频信号,并向后端的MediaMTX持续推送视频数据。

librestreaming是一款基于Android的实时滤镜RTMP推流库,它使用MediaCodec API进行视频和音频编码,并使用librtmp库执行rtmp流式传输。此外,librestreaming还提供了在摄像头捕捉阶段之后和编码阶段之前实时视频滤镜的功能。

librestreaming的源码托管地址为https://github.com/lakeinchina/librestreaming(星星数1.0k),国内的镜像地址为https://gitee.com/mirrors/librestreaming,该框架的最后更新时间为2020年8月,并支持到Android 7.0。虽然librestreaming很久没有更新了,但其源码功能完备、代码也不太难,具有很高的学习和研究价值。

由于librestreaming源码的更新时间较早,为了让小海豚版本的Android Studio Dolphin能够打开它的范例工程,需要对librestreaming的App工程作如下修改:

一、补充gradle目录

下载完的librestreaming源码包缺少gradle目录,不能被Android Studio直接打开,需要先把其他App项目的gradle目录整个复制过来,并且打开gradle/gradle-wrapper.properties,把distributionUrl这行配置改成下面这样,表示使用6.7.1版本的Gradle

distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip

二、更新工具库的仓库位置

打开librestreaming工程的build.gradle,把里面的两处配置

jcenter()
google()

都改为以下配置:

// 以下四行添加阿里云的仓库地址,方便国内开发者下载相关插件
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { url 'https://maven.aliyun.com/repository/public'}
google()
mavenCentral()

因为jcenter仓库已经废弃,所以改成引用国内的仓库位置。

三、修改模块的build.gradle

打开sample/build.gradle,先把“renderscriptTargetApi 20”这行注释,再把两处“JavaVersion.VERSION_1_7”改为“JavaVersion.VERSION_1_8”,以便适配对应的Gradle版本。

如果不这么改的话,Gradle构建时会报错“Failed to calculate the value of task ':librestreaming:compileDebugJavaWithJavac' property 'options.generatedSourceOutputDirectory'.”

四、把Support库迁移到AndroidX

librestreaming工程引用了支持库Support v27,但Android早已废弃Support库,转为使用AndroidX库,所以需要把支持库迁移到AndroidX。在Android Studio Dolphin的主界面依次选择顶部菜单“Refactor”→“Migrate to AndroidX”,即可将App工程的Support库迁移到AndroidX库。

完成以上三处修改后,重新编译App安装到真机上,启动后的推流配置界面如下图所示:

可见在推流之前,得先输入流媒体服务器的推流地址。为此按照《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2  FFmpeg向网络推流”说明,在电脑上启动MediaMTX,并通过命令“ipconfig /all”找到电脑位于WiFi的局域网IP。

确保手机和电脑连接了同一个WiFi,再往librestreaming的App配置界面填上MediaMTX的完整推流地址如“rtmp://192.168.*.*:1935/stream”,接着点击START按钮,打开推流预览界面如下图所示。

点击左上角的START按钮可开始推流,点击SWAP按钮可切换前后摄像头,点击FLASH按钮可开关闪光灯。那么点击START按钮开始推流,librestreaming就把摄像头采集到的视频数据向MediaMTX推流。

然后电脑打开VLC media player,依次选择菜单:媒体→打开网络串流,在弹窗的URL栏输入对应的MediaMTX拉流地址“rtmp://192.168.*.*:1935/stream”如下图所示。

确认输入无误后,单击右下角的播放按钮,此时VLC media player就自动播放来自拉流地址的视频画面如下图所示。

对比librestreaming的推流预览界面和VLC media player的拉流播放界面,可知手机摄像头采集到的视频信号正确传送给了电脑。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

FFmpeg开发笔记(八十四)使用国产的librestreaming实现RTMP直播的更多相关文章

  1. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  2. 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口

    前言   上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...

  3. Java开发笔记(十四)几种运算符的优先级顺序

    到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符.赋值运算符.逻辑运算符.关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术.逻辑.关系等运算,最后 ...

  4. .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)

    上一篇中说到了“泵”在编程中的作用以及一些具体用处,但没有实际demo,可能不好理解,这篇文章我分享一个UDP通信的demo,大概实现了类似“飞鸽传书”在局域网中文本消息和文件传输的功能.功能不全也不 ...

  5. Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件

    前言   上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤.   受限制   因为直接配置sample的vi比较麻烦 ...

  6. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  9. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  10. Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重

    为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(ResponseMessage)的情况下,会多次发送同一条请求消息(RequestMessage),包括MsgId等在内的所有文本内容都 ...

随机推荐

  1. POLIR-Society-Organization-Politics: “How”-政治的: Versatility+历史+应然+实然:零食“脱氢乙酸钠”:"衣食住行|生育工作挣钱用钱|"

    POLIR-Society-Organization-Politics: "How"-政治的: Versatility+历史+应然+实然:人民群众的"衣食住行|生育工作挣 ...

  2. LINUX中防护墙放行端口--九五小庞

    1.查看开放的端口firewall-cmd --list-ports 2.防护墙放行3306端口firewall-cmd --zone=public --add-port=3306/tcp --per ...

  3. JavaScript 编年史:探索前端界巨变的幕后推手

    原文地址:https://deno.com/blog/history-of-javascript JavaScript 简史 今年,JavaScript 迎来了 30 岁生日. 在这三十年里,Java ...

  4. JAVA的版本及JDK的安装和卸载

    Java的三大版本 JavaSE JavaSE是标准版本,也是基础版本.主要用来开发桌面应用程序,控制台程序. JavaME javaME是嵌入式开发版本.主要用来开发手机应用程序,小家电的嵌入式开发 ...

  5. 单片机+GPRS模块和主流物联网平台实现MQTT协议通信视频教程

    单片机+GPRS模块和主流物联网平台实现MQTT协议通信视频教程 1.单片机+GPRS模块和阿里云物联网平台实现MQTT协议通信视频教程单片机+GPRS模块和阿里云物联网平台实现MQTT协议通信,阿里 ...

  6. 分享一个 MySQL binlog 分析小工具

    去年写的一个小工具,用于在线获取 MySQL binlog 的大小.开始时间.结束时间和持续时长. 什么场景下会用上这个工具呢? 云服务场景,无法登录 MySQL 服务器查看 binlog 的时间戳信 ...

  7. 将openGLProgrammingGuide7/8版和openGLSuperBible7的源代码转换为C#

    我找到的openGL示例代码一般都是C++写的,编译起来很是困难,不是缺这个lib就是少那个模型,要不就是一堆令人绝望的bug. 最近终于得到了OpenGL Programming Guide 7th ...

  8. P1141 01迷宫 (搜索,dfs,bfs)

    洛谷链接:https://www.luogu.com.cn/problem/P1141 P1141 01迷宫 题目描述 有一个仅由数字 \(0\) 与 \(1\) 组成的 \(n \times n\) ...

  9. Java文件写入与编码、字节数组、字符集、字符编解码 一文打通!

    1. 编码操作和解码操作 编码操作是把字符串映射为一组byte序列.以何种方式映射?比如把"你"映射为00000000还是11111111?这是由编码集决定的. 常见的字符编码集如 ...

  10. Oracle DBA必备脚本:一键获取SQL性能数据,快速定位性能拐点

    我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...