# AVRtmpPushSDK
**Repository Path**: jaesoon/avrtmp-push-sdk
## Basic Information
- **Project Name**: AVRtmpPushSDK
- **Description**: fork 自 https://github.com/yangkun19921001/AVRtmpPushSDK.git, 加上了一些自己的注释和修改
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-12-03
- **Last Updated**: 2025-02-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## AVRtmpPushSDK
> Jaeson声明:本项目 fork 自 https://github.com/yangkun19921001/AVRtmpPushSDK.git, 添加了一些注释和优化。
欢迎关注 **AVRtmpPushSDK** 直播开源项目,这是一个由 kotlin 、C++ 编写的项目。整个项目完成了采集、 视音频处理、编码、数据发送前处理、数据发送的功能。整个项目支持 flv 封包,rtmp 上传,当然也向外面提供了封包和上传的相关接口。 整个项目均由个人编写完成,可能某些地方会有一些不足之处,欢迎您提出宝贵的意见和建议。
**下载 APK 体验**

### 支持功能
>- 音视频硬件编码
>- 动态码率调整
>- 摄像头参数设置
>- 音频编码参数设置
>- 视频编码参数设置
>- 支持添加图片、文字水印
>- 支持摄像头切换
>- 支持 flv 封包
>- 支持自动对焦
>- 支持 Live 模式下横竖屏动态切换
###要求
>Android SDK 版本 18+
### 如何使用
#### 1、添加远程依赖
```groovy
implementation 'com.devyk.av.rtmp.library:AVRtmpPushSDK:1.0.0'
```
#### 2、添加权限
```
```
ps: 在Android 6.0以后很多权限需要动态申请. 如果你想快速使用,可以将项目的targetSdkVersion设置在23一下。
#### 3、预览窗口
```kotlin
```
#### 4、参数配置
**4.1、XML 配置**
>是否后置摄像头优先 -> live:back
>
>预览编码的帧率 -> live:fps
>
>音频采样率 -> live:sampleRate
>
>预览宽高 -> live:preview_height/live:preview_width
>
>视频最大码率 -> live:videoMaxRate
>
>视频最低码率 -> live:videoMinRate
**4.2、代码配置**
4.2.1 、音频采集编码参数设置
```kotlin
//初始化音频参数
var audioConfiguration = AudioConfiguration.createDefault()
live.setAudioConfigure(audioConfiguration)
```
4.2.2、视频编码参数设置
```kotlin
var videoConfiguration = VideoConfiguration.Builder()
.setBps(400, 800)
.setFps(25)
.setCodeType(VideoConfiguration.ICODEC.ENCODE)
.setSize(320, 240)
.setIfi(5)
.setMediaCodec(true)
.build()
live.setVideoConfigure(videoConfiguration)
```
4.2.3、camera 预览参数设置
```kotlin
//初始化 camera 参数
var cameraConfiguration = CameraConfiguration.Builder()
.setFacing(CameraConfiguration.Facing.FRONT)
.setFps(25)
.setPreview(320, 240)
.build()
live.setCameraConfigure(cameraConfiguration)
```
####5、设置打包器
```kotlin
var mPacker = RtmpPacker()
live.setPacker(mPacker)
```
#### 6、设置发送器
```kotlin
private var mDataSource = "rtmp://[ip]:[port]/devykLive/live1"
mSender = RtmpSender()
mSender.setDataSource(mDataSource)
live.setSender(mSender)
```
#### 7、添加水印
```kotlin
/**
* OpenGL 物体坐标,对应 Android 屏幕坐标
*
* -1.0,1.0 1.0,1.0
* -------------------------------------
* | |
* | |
* | |
* | |
* | |
* | |
* | |
* | |
* | |
* | 这里就是水印坐标 |
* | |----- |
* | | | |
* | ——-—-| |
* --------------------------------------
* -1.0,1.0 1.0,-1.0
* 默认水印坐标地址,对应在屏幕右下角,用户可以自定义坐标
*/
private var mVertexData = floatArrayOf(
0.55f, -0.9f, //第一个点 左下角
0.9f, -0.9f, //第二个点 右下角
0.55f, -0.7f, //第三个点 左上角
0.9f, -0.7f //第四个点 右上角
)
//设置 Bitmap 水印 第二个参数如果传 null 那么默认在右下角
live.setWatermark(Watermark(BitmapFactory.decodeResource(resources,R.mipmap.live_logo), mVertexData))
//设置文字水印 textSize 设置 20 那么会根据设置的坐标进行拉伸,传入 null 内部自动处理
live.setWatermark(Watermark("随播",Color.WHITE,20,null))
```
#### 8、开始预览
```kotlin
live.startPreview()
```
#### 9、连接 rtmp 服务器
```kotlin
mSender?.setOnConnectListener(lis: OnConnectListener)
mSender?.connect()
//rtmp 直播服务器连接回调
public interface OnConnectListener {
/**
* 开始链接
*/
fun onConnecting()
/**
* 连接成功
*/
fun onConnected()
/**
* 推送失败
*/
fun onFail(message:String)
/**
* 关闭
*/
fun onClose()
}
```
#### 10、开始直播
```kotlin
//开始进行打包
mPacker.start()
//开始进行直播推流
live.startLive()
```
#### 11、动态设置码率
````kotlin
live.setVideoBps(bps:Int)
````
#### 12、停止直播
```kotlin
//停止音视频采集编解码
live.stopLive()
//关闭 rtmp 服务
mSender?.close()
//关闭打包器
mPacker.stop()
```
#### 13、横竖屏适配
```kotlin
//1、Activity 页面添加如下配置
android:configChanges="orientation|keyboardHidden|screenSize"
//2. 实现横竖屏切换监听
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
live.previewAngle(this)
}
```