​《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. unity实现 动作游戏的连招/连击

    工程下载:https://files.cnblogs.com/files/sanyejun/ComboAttack.7z 全网也没查到比较好的资料,自己弄了个 一共是3个脚本 先上图 黑色为触发条件 ...

  2. Abp vNext -动态 C# API 实现原理解析

    作为铺垫后续阅读源码的一些帮助,开始想直接开始尝试读源码,但是发现上下文连接不紧密,很突兀,所以还是简单介绍下如何使用.最起码从0-1.然后发现他解决的问题, 其实官方文档是有介绍如何使用的,只是比较 ...

  3. XMOJ 四月月赛 T3 旅行 题解

    我们首先尝试挖掘这个分组的性质. 我们发现,我们可以把在同一个组的夫妻和不在同一个组的夫妻分开来处理. 这里,分开之后我们只需要让一种情况有顺序,另外一种不能有顺序.如果两个没有顺序 / 有顺序的序列 ...

  4. 基于Astro开发的Fuwari静态博客模版配置CICD流程

    基于Astro开发的Fuwari静态博客模版配置CICD流程 前言 同往常一样,上班摸鱼的时候,就喜欢逛逛随机逛逛别人的博客,然后有一个博客的主题让我有点心动. 我自己也是部署了博客的,我目前的博客网 ...

  5. a+b=c,处理器一步搞定,Java虚拟机为啥要四步?

    基于栈的运行方式 Java虚拟机的执行过程基于字节码指令,可以将其视为对操作系统的一种抽象模拟.Java虚拟机具有自己的指令集和运行环境,包括堆(Heap).栈(Stack).方法区(Method A ...

  6. SpringBoot系列之RestTemplate调https接口

    业务:本系统接口都是http的,调用第三方接口,因为做了安全性校验,所以不能通过RestTemplate调用 方法:重写覆盖SimpleClientHttpRequestFactory抽象类的prep ...

  7. 修改Element Slider 滑块 label选中样式 (自定义 Elementui Slider 滑块 样式)

    效果图: 1,加入slider滑块代码 <el-slider v-model="level" vertical :show-stops="true" :s ...

  8. 那些被推迟的 C# 14 特性及其背后的故事

    C# 14 带着 .NET 10 一同发布了,带来了一系列诸如扩展成员.field 关键字.空条件赋值等不错的"生活质量"改进.但说实话,对于我们这些老鸟来说,社区的期待往往是更高 ...

  9. flask部分漏洞

    Flask 前置知识 什么是flask Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,在介绍Flask之前首先来聊下它和Django的联 ...

  10. [题解]P3147 [USACO16OPEN] 262144 P

    P3146 [USACO16OPEN] 248 G(弱化版) P3147 [USACO16OPEN] 262144 P 我们先考虑区间dp,设\(f[i][j]\)表示\(a[i,j]\)恰好合并成\ ...