在手机 App 中通过 FFmpeg 推送 RTMP 流,可以实现将音视频实时传输到 RTMP 服务器(如 SRS)。以下是实现的详细步骤:
1.准备工作
- 确保 RTMP 服务器(如 SRS)已经配置并运行。
- 在手机开发环境中集成 FFmpeg 库,例如: Android:使用 FFmpeg-Android 或 MobileFFmpeg。 iOS:使用 FFmpeg 编译库或通过第三方框架如 FFmpeg-iOS。
2.推流的 FFmpeg 命令
推流命令的基本结构如下:
ffmpeg -re -f avfoundation -framerate 30 -video_size 1280x720 -i 0:1 -c:v libx264 -preset ultrafast -c:a aac -b:a 128k -f flv rtmp://your-srs-server-ip/live/stream
- 解释:
- -f avfoundation:指定输入格式(iOS 使用 avfoundation,Android 使用 android_camera)。 -framerate 30:设置帧率。
- -video_size 1280x720:分辨率。
- -i 0:1:选择音视频输入源(0 是音频,1 是视频,具体根据设备调整)。
- -c:v libx264:指定视频编码为 H.264。
- -preset ultrafast:设置编码速度优先。
- -c:a aac:指定音频编码为 AAC。
- -b:a 128k:设置音频码率。
- -f flv:指定输出格式为 FLV。 rtmp://your-srs-server-ip/live/stream:目标 RTMP 服务器地址。
3.在 Android 上实现
集成 FFmpeg
- 在 build.gradle 中添加 MobileFFmpeg 依赖:
implementation 'com.arthenica:ffmpeg-kit-min:4.5.LTS'
- 使用 FFmpeg 推流:
FFmpegKit.executeAsync("-re -f android_camera -framerate 30 -video_size 1280x720 -i 0:1 -c:v libx264 -preset ultrafast -c:a aac -b:a 128k -f flv rtmp://your-srs-server-ip/live/stream",
session -> {
Log.d("FFmpeg", "Session completed with state " + session.getState());
});
权限
- 确保在 AndroidManifest.xml 中声明摄像头和麦克风权限:
4.在 iOS 上实现
集成 FFmpeg
- 使用 CocoaPods 添加 FFmpeg-iOS:
pod 'mobile-ffmpeg-full'
- 推流代码示例:
let command = "-re -f avfoundation -framerate 30 -video_size 1280x720 -i 0:1 -c:v libx264 -preset ultrafast -c:a aac -b:a 128k -f flv rtmp://your-srs-server-ip/live/stream"
FFmpegKit.executeAsync(command) { session in
let returnCode = session?.getReturnCode()
print("FFmpeg session completed with return code: \(returnCode ?? -1)")
}
权限
- 在 Info.plist 文件中添加以下权限:
NSCameraUsageDescription
需要访问摄像头进行直播
NSMicrophoneUsageDescription
需要访问麦克风进行直播
5.测试和验证
- 推流地址:在 RTMP 服务器上确认推流地址,如 rtmp://your-srs-server-ip/live/stream。
- 播放:用 VLC 或其他播放器打开 RTMP 地址,验证推流效果。
6.优化建议
- 分辨率与码率调整:根据网络环境和硬件性能设置合适的分辨率和码率。
- 网络监测:增加网络状态监听,动态调整推流参数。
- 错误处理:捕获 FFmpeg 的返回码,处理推流失败情况。