目录:
RTMP(一)录屏直播理论入门
RTMP(二)搭建推流服务
RTMP (三)音视频采集与数据封包
RTMP(四)交叉编译与CameraX
RTMP (五)摄像头数据处理
RTMP (六)音视频编码推流
RTMP
Real Time Messaging Protocol(实时消息传输协议)
基于TCP的应用层协议
FFmpeg 之前相关文章
FFmpeg: 引擎,集成第三方的编解码 协议库
我们借助的librtmp.a 库
FFmpeg 只能播放>>>> rtmp://域名/xxxx
librtmp.a 可以播放>>>> rtmp://ip:port/xxxx
LIBRTMP
C语言开源RTMP库,封装 Socket 建立TCP通信,
并实现了RTMP数据的收发。
正如 OKHTTP 封装了Socket完成HTTP数据的收发!
RTMPDump
主页
引入:
预编译: 预编译出库
以源码的方式引入:如果类似ffmpeg就不适合源码太多。RTMPDump 源码少 都可以
RTMP直播实现流程
MediaProjection 视频采集 AndroidSDK中的接口
Camera 获取手机图像数据
- 怎么创建Surface(离屏幕画布)
- 怎么从Surface 中获取图像数据
virtualDisplay
获得MediaProjection后调用createVirtualDisplay创建虚拟显示器VirtualDisplay ,即会将手机屏幕镜像到虚拟显示器上。
在createVirtualDisplay时,需要传递一个Surface(画布)。需要获取图像数据即可从这个Surface中读取。
MediaCodec 编码
// 从编码器创建一个画布, 画布上的图像会被编码器自动编码
Surface surface = mediaCodec.createInputSurface();
MediaCodec
MediaFormat mediaFormat =
MediaFormat.createVideoFormat(
MediaFormat.MIMETYPE_VIDEO_AVC,
360, 640);
//码率,帧率,分辨率,关键帧间隔
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 400_000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);//FPS
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2);
//编码数据源格式
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
try {
mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
mediaCodec.configure(mediaFormat, null, null,
MediaCodec.CONFIGURE_FLAG_ENCODE);
Surface inputSurface = mediaCodec.createInputSurface();
virtualDisplay = mediaProjection.createVirtualDisplay("abc"
, 360, 640, 1, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
inputSurface, null, null);
} catch (IOException e) {
e.printStackTrace();
}
码率,帧率,分辨率,关键帧间隔
码率:单位是间内视频数据的大小
帧率: 单位是间内切换图片数量
分辨率:平时所说的类1080x720等
I: 能够表示一张完整的图像
P: 向前预测,需要参考前面的I/P
B: 双向,需要参考前面好后面的I/P
一组: gop (group)
I P P P P I P P P P 必须到第二个I帧才能播放出来,也就是我们直播出来的时候有一个开屏,一般设置间隔时间(0-3s)