# Android CameraX 摄像头RTMP推流实现
[代码传送门GItHub](https://github.com/kusebingtang/ffmpeg_x264_AVFoundation_Project/tree/main/CameraXAchiveH264)
## CameraX摄像头数据获取
```groovy
def camerax_version = "1.0.0-alpha05"
implementation "androidx.camera:camera-camera2:$camerax_version"
```
权限申请
```css
```
动态权限获取
```java
public boolean checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO
}, 1);
}
return false;
}
```
获取摄像头数据
```java
//子线程中回调
handlerThread = new HandlerThread("Analyze-thread");
handlerThread.start();
CameraX.bindToLifecycle(lifecycleOwner, getPreView(), getAnalysis());
```
```java
private Preview getPreView() {
// 分辨率并不是最终的分辨率,CameraX会自动根据设备的支持情况,结合你的参数,设置一个最为接近的分辨率
PreviewConfig previewConfig = new PreviewConfig.Builder().setTargetResolution(new Size(width, height)).setLensFacing(currentFacing).build();
Preview preview = new Preview(previewConfig);
preview.setOnPreviewOutputUpdateListener(this);
return preview;
}
```
```java
private ImageAnalysis getAnalysis() {
ImageAnalysisConfig imageAnalysisConfig = new ImageAnalysisConfig.Builder()
.setCallbackHandler(new Handler(handlerThread.getLooper()))
.setLensFacing(currentFacing)
.setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
.setTargetResolution(new Size(width, height))
.build();
ImageAnalysis imageAnalysis = new ImageAnalysis(imageAnalysisConfig);
imageAnalysis.setAnalyzer(this);
return imageAnalysis;
}
```
数据接收回调方法
```java
@Override
public void analyze(ImageProxy image, int rotationDegrees) {
//图像格式
int format = image.getFormat();
if (format != ImageFormat.YUV_420_888) {
throw new IllegalStateException("根据文档,Camerax图像分析返回的就是YUV420!");
}
}
```
回调数据处理[Android CameraX 摄像头数据ImageProxy数据分析](https://www.jianshu.com/p/b217be3806b3)
### LIBRTMP
C语言开源RTMP库,封装 Socket 建立TCP通信,并实现了RTMP数据的收发。
#### RTMPDump
[rtmpdump](https://links.jianshu.com/go?to=http%3A%2F%2Frtmpdump.mplayerhq.hu%2F) is a toolkit for RTMP streams. All forms of RTMP are supported, including rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://.
License: GPLv2
Copyright (C) 2009 Andrej Stepanchuk
Copyright (C) 2010-2011 Howard Chu
Download the source:
```sh
git clone git://git.ffmpeg.org/rtmpdump
```
The latest release is 2.4 which you can check out from git. Aside from various minor bugfixes since 2.3, RTMPE type 9 handshakes are now supported.
使用第三方库 Rtmpdump 来实现推流到直播服务器,由于 Rtmpdump 的代码量不是很多,我们直接拷贝源代码到 Android 的 cpp 文件
```cmake
#定义宏 如果代码中定义了 #defind NO_CRYPTO
#就表示不适用ssl,不支持rtmps。我们这里不支持ssl
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")
# 把当前目录下所有得文件 变成一个 SOURCE变量表示
aux_source_directory(. SOURCE)
# 编译成librtmp.a 静态库,编译源文件引用${SOURCE}获取
add_library(rtmp STATIC ${SOURCE})
```
工程cmake引入编译好的rtmp静态库
&#