Skip to content

About

安卓视频流推流小工具,可以选择屏幕或者摄像头作为视频源

Resources

Stars

9 stars

Watchers

0 watching

Forks

Repository files navigation

VideoStreamer

VideoStreamer 是一个专为 Android 设备设计的视频流媒体应用,旨在提供高质量的屏幕镜像和流媒体体验。

主要特性

  • 实时屏幕镜像:无缝地将 Android 设备屏幕镜像到其他设备。
  • 高分辨率支持:默认原生分辨率
  • 易于集成:兼容 OBS 等流媒体软件,便于直播和录制。
  • 支持的输入: 屏幕捕获,摄像头录制
  • 低延迟音频流:搭配指定程序可以低延迟的把内录音频推送到电脑播放,测试设备上约90ms延迟。

为什么不选择 scrcpy

虽然 scrcpy 是一个广受欢迎的开源 Android 屏幕镜像工具,但我在开发 VideoStreamer 时选择不依赖它,主要基于以下原因:

  • 容易崩溃:scrcpy 在某些网络条件不佳、设备兼容性问题或长时间运行时容易出现崩溃,导致用户体验中断。
  • OBS 集成不便:要将 scrcpy 的输出集成到 OBS 等流媒体软件中,必须通过窗口采集方式获取,这会导致原始分辨率丢失,无法充分利用高清画面的优势。
  • 流畅度不足:scrcpy 在处理高分辨率内容或复杂动画时,流畅度不够理想,容易出现画面卡顿或帧率下降。

值得注意的是,本项目也存在延迟方面的缺点。这是缓冲机制的问题,但缓冲过小反而可能引发卡顿。

安装和使用

要求

  • Android API 级别 29 或更高
  • 一个 RTMP 流服务器

原生 QUIC 构建

QUIC 传输使用 Alibaba XQUIC v1.9.5,TLS 后端固定为 Tongsuo(铜锁,原 BabaSSL) 8.3-stable。 XQUIC 与 Tongsuo 都以 Git 子模块固定到已验证提交;Android 包只生成 arm64-v8a,最低 API 为 29。

首次构建或更新子模块后执行:

git submodule update --init --recursive
./scripts/build-tongsuo-android.sh

Windows 请在 Git Bash 中运行上面的 Tongsuo 脚本,并准备 Android NDK 27.2.12479018、CMake 3.22.1、Perl 与 Make。脚本默认从 local.properties 读取 Android SDK 路径,将静态库放到忽略提交的 third_party/build/。随后在 PowerShell 或终端构建应用:

.\gradlew.bat assembleDebug

如需指定环境,可设置 ANDROID_NDK_HOME、ANDROID_API 或 ANDROID_ABIS。应用层的 ALPN、控制消息、流方向和媒体封包保持原 LiveSuite 协议不变,因此无需修改服务端。

使用指南

  1. 启动应用。
  2. 连接目标设备。
  3. 开始流媒体传输。

游戏时后台录屏

设置中的「录屏仅使用硬件编码器」默认开启,下次启动录屏推流时生效。关闭后允许软件编码兜底,仍优先选择硬件;相机的编码器策略独立。录屏保留原生分辨率,帧率和码率沿用已保存的设置。

录屏授权后,虚拟显示器在编码器就绪前不挂接画面 Surface,停止推流时也会断开。Android 允许初始 Surface 为 null,无需额外保留全分辨率的占位图形缓冲。编码器输出先归还硬件缓冲区,再做码流转换和网络入队;PCM、H.264 和 QUIC 封包减少了中间数组,RTMP 发送线程由入队唤醒。

真机对比时应使用相同手机、游戏场景、画质、网络和推流参数,分别观察游戏帧时间、接收端录制帧率、音画同步及持续运行后的内存占用。需要覆盖纯视频、音视频、独立音频、横竖屏切换、反复启停和网络拥塞。构建通过只能验证代码与打包,不能代替真机的功耗、温度和流畅度测量。

搭配obs

你可以自行实现服务端,或者使用我们的GUI客户端LiveSuite,也可以参考这个Node.js的简单实现:

import NodeMediaServer from 'node-media-server';

const config = {
  rtmp: {
    port: 1935,
    chunk_size: 30000,
    gop_cache: false,
    ping: 30,
    ping_timeout: 60
  }
};

const nms = new NodeMediaServer(config);
nms.run();

nms.on('postPublish', (sessions) => {
});

nms.on('donePublish', (sessions) => {
});

而后,在OBS中添加媒体源,链接填入对应的流链接。例如,设备推流为rtmp:///device/stream ,OBS中添加媒体源为rtmp:///device/stream

声明

本项目主要由AI编写,代码质量可能存在问题 250 warnings ,如有大佬发现问题,请提issue,万分感谢。

第三方原生组件及许可证见 THIRD_PARTY_NOTICES.md。

已知问题

长时间使用可能把音频内录干崩,干崩了就只有重启内录才有声音了我也不知道是不是我的问题了,因为试了下居然其它应用还有声,并且重启也没用。

相关项目

  • LiveSuiteGUI客户端,包含rtmp流服务器和音频服务器程序,可以完整搭配使用
  • udp-audio-server音频程序本体

About

安卓视频流推流小工具,可以选择屏幕或者摄像头作为视频源

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages