《FFmpeg开发实战:从零基础到短视频上线》一书的"10.2.2 FFmpeg向网络推流"介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。可是在此之前,得先有一个推流工具向MediaMTX推送视频流,这样末端的拉流程序才能从MediaMTX源源不断地拉取视频流。那么Android手机可使用anyRTC从摄像头实时采集视频信号,并向后端的MediaMTX持续推送视频数据。
anyRTC是一款基于Android的实时滤镜RTMP推流库,它使用MediaCodec的API进行视频和音频编码,并使用librtmp库执行rtmp流式传输。此外,anyRTC还提供了在摄像头捕捉阶段之后和编码阶段之前实时视频滤镜的功能。
anyLive是anyRTC开源的推拉流项目,它采用跨平台架构设计(采用WebRTC(93)版本为基础框架),一套代码支持Android、iOS、Windows、Mac、Ubuntu等平台。anyRTC支持的流媒体协议包括rtmp、http/https、rtsp、hls、m3u8、mkv、mp3、mp4等,引用的第三方库包括libfaac 1.28、libfaad2 2.7、ffmpeg 4.3、libsrtp、libvpx等等。
其中Android版本的anyRTC位于源码包的Prj-Android目录,Prj-Android工程基于Kotlin+Compose编码,最低支持到Android4.4,并采用Android 12.0编译,具有很高的学习和研究价值。并且通过小海豚版本的Android Studio Dolphin即可打开Prj-Android工程,可谓十分方便。
这里以Android Studio Dolphin(小海豚版本)为例,介绍如何在App工程中导入并编译anyRTC,详细的操作步骤如下。
一、修改案例工程的Gradle版本
打开Prj-Android/gradle/wrapper/gradle-wrapper.properties,把下面这行
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
改成下面这行,也就是把Gradle7.0.2升级级到7.2。
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
二、修改模块级别的build.gradle
打开Prj-Android/liveplayer/build.gradle,注释掉下面的ndkVersion这行:
ndkVersion '20.0.5594570'
因为实测发现编译Prj-Android项目采用android-ndk-r18b版本即可。
三、导入编译好的so文件
到这里下载压缩包https://storage.agrtc.cn:1000/share/0v2et4RX,解压后将lib文件夹放到Prj-Android/liveplayer/src/main/cpp目录下,再使用小海豚版本的Android Studio Dolphin打开Prj-Android项目。
四、修改默认的拉流地址
打开Prj-Android项目的app\src\main\java\io\anyrtc\liveplayer\PullActivity.kt,把下面这行代码
go(PullActivity::class.java, Pair("url",VIDEO_1))
改成下面这行,也就是把拉流地址改为用户输入的直播链接:
go(PullActivity::class.java, Pair("url",binding.etUrl.text.toString()))
以上几个步骤的修改之后,编译运行anyRTC的App工程,在真机上看到的anyRTC初始界面如下图所示。

可见anyRTC既支持向服务器推流,也支持从服务器拉流。那么准备两部安卓手机,一部用于推流,另一部用于拉流。用于推流的手机点击App界面上的【直播推流】区域,打开推流页面如下图所示:

在推流之前,得先输入流媒体服务器的推流地址。为此按照《FFmpeg开发实战:从零基础到短视频上线》一书的"10.2.2 FFmpeg向网络推流"说明,在电脑上启动MediaMTX,并通过命令"ipconfig /all"找到电脑位于WiFi的局域网IP。
确保手机和电脑连接了同一个WiFi,再往anyRTC的推流界面填上MediaMTX的完整推流地址如"rtmp://192.168.*.*:1935/stream",接着点击【开始推流】按钮,打开推流预览界面如下图所示。

点击左上角的翻转按钮可切换前后摄像头,点击麦克风按钮可开关声音,可见anyRTC正在把摄像头采集到的视频数据向MediaMTX推流。
然后另一部手机点击App界面上的【直播拉流】区域,打开拉流页面如下图所示:

在拉流页面中输入对应的MediaMTX拉流地址"rtmp://192.168.*.*:1935/stream",接着点击页面下方的【开始播放】按钮,此时anyRTC就自动播放来自拉流地址的视频画面如下图所示。

对比anyRTC的推流预览界面和拉流播放界面,可知一部手机摄像头采集到的视频信号正确传送给了另一部手机。
更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。
本系列的FFmpeg进阶文章目录为《FFmpeg开发笔记全目录(FFmpeg开发实战详解,含直播系统的搭建过程)》