# AwesomePlayerDemo
**Repository Path**: dwdyoung/awosome-player
## Basic Information
- **Project Name**: AwesomePlayerDemo
- **Description**: No description available
- **Primary Language**: Java
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2020-11-10
- **Last Updated**: 2024-10-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: ffmpeg, 编解码
## README
# AwesomePlayerDemo
## 介绍
### 同屏相关技术
本项目主要提供同屏技术的底层实现方式,向上层提供lib库。本demo包含发送端和接收端,发送端可以将自身的屏幕编码成H264等编码格式,然后通过UDP或者TCP方式发送到接收端,达到2个设备显示内容同步的目的。
## 实现原理
### 截屏并编码
发送端通过 MediaProjectionManager 获取屏幕数据,之后通过硬编码和软编码方式将屏幕YUV编码成H264格式。
- 硬编码请查看 cpp_lib/src/main/java/com/gonsin/paperless2/sdk/sync/hard 目录相关代码
- 软编码采用ffmpeg技术,相关代码在 cpp_lib/src/main/cpp
### 发送数据
成功编码成H264之后,通过netty框架采用私有的协议发送到接收端,私有协议内容参考 数据服务器流媒体协议.md
本demo基于netty技术,和原生java技术实现了多种的发送器和接收器,接口名字分别是 ISender 和 IReceiver ,所有的实现均在cpp_lib/src/main/java/com/gonsin/paperless2/sdk/sync/connector可以查找到
本demo可以选择不同的 发送器 将 MediaData 发送到接收端。
### 接收数据
接收端同样采用 接收器 IReceiver 实现,关键代码路径如上。
### 解码并显示
接收器可以设置通过硬解码和软解码对H264进行解码,相关解码的代码与编码路径一直,参考以上内容。
解码成功之后,显示到屏幕上采用2种方式
- 软解码的方式,采用 GLFrameSurface 显示
- 硬编码方式,采用 SurfaceView 显示