直播软件开发推流过程详解

简介: 直播过程1.相机预览及数据采集Camera — 取数据(onPreviewFrame(Byte[] rawFrameData, Camera camera)) 2.原始帧处理(Rotate旋转/Scale缩放:使用Libyuv/FFmpeg等工具库) 3.编码器编码得到相应的h24数据(openh264库编码) 4.发送给流媒体服务器 (librtmp库推流) 5.服务器接受及转发

直播过程

1.相机预览及数据采集Camera — 取数据(onPreviewFrame(Byte[] rawFrameData, Camera camera)) 
2.原始帧处理(Rotate旋转/Scale缩放:使用Libyuv/FFmpeg等工具库) 
3.编码器编码得到相应的h24数据(openh264库编码) 
4.发送给流媒体服务器 (librtmp库推流) 
5.服务器接受及转发

原文地址:点击打开链接

一、数据采集及预览

1.Surfaceview+Camera 
2.GLSurfaceView +SurfaceTexture (openglees 做滤镜美颜功能)

二、原始帧处理

onPreviewFrame 默认得到的是NV21格式的数据,需要转换程I420 
2.1转换I420(YUV420P)

为什么要使用转I420 
1.Camera预览格式:NV21、YV12 ,默认是NV21 格式 
2.H264编码必须要用 I420格式的YUV420 

YUV420的几种格式

NV12,NV21,YV12,I420都属于YUV420,但是YUV420 又分为YUV420P,YUV420SP,P与SP区别就是,前者YUV420P UV顺序存储,而YUV420SP则是UV交错存储,这是最大的区别,具体的yuv排序就是这样的: 
I420: YYYYYYYY UU VV ->YUV420P 
YV12: YYYYYYYY VV UU ->YUV420P 
NV12: YYYYYYYY UVUV ->YUV420SP 
NV21: YYYYYYYY VUVU ->YUV420SP

Libyuv库是一个专门对YUV数据进行转换缩放旋转的库

YUV是Google已经开源了专门用于YUV数据的处理的库。它拥有如下特性 
1、libYUV是一个开源的实现各种YUV,RGB色彩之间的转换、旋转、缩放 
2、支持windows、linux系统,支持x86、arm架构 
3、支持SSE、AVX、NEON加速,在编译时会根据硬件平台旋转使用的实现方式 
源码地址: 
https://chromium.googlesource.com/libyuv/libyuv/

三、视频编码

3.1.MediaCodec 
NV21 格式并不是所有机器的 MediaCodec 都支持这种格式作为编码器的输入格式。 因此,在初始化 MediaCodec 的时候,我们需要通过 codecInfo.getCapabilitiesForType 来查询机器上的 MediaCodec 实现具体支持哪些 YUV 格式作为输入格式。一般来说,起码在 4.4+ 的系统上,这两种格式在大部分机器上都有支持: 
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar 
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar 
两种格式分别是 YUV420P 和 NV21,如果机器上只支持 YUV420P 格式,则需要先将摄像头输出的 NV21 格式先转换成 YUV420P,才能送入编码器进行编码,否则最终出来的视频就会花屏,或者颜色出现错乱。

3.2.FFMpeg+x264/openh264 
H264编码必须要用 I420格式

3.3软硬编对比 
从上面的分析来看,硬编的好处主要在于速度快,而且系统自带,不需要引入外部的库,但是特性支持有限,而且硬编的压缩率一般偏低。对于软编码来说,虽然速度较慢,但是压缩率比较高,而且支持的 H264 特性也会比硬编码多很多,相对来说比较可控。就可用性而言,在 4.4+的系统上,MediaCodec 的可用性是能够基本保证的,但是不同等级机器的编码器能力会有不少差别,建议可以根据机器的配置,选择不同的编码器配置。

四、rtmp推流

使用librtmp库推流

五、服务器搭建

nginx-rtmp-module搭建rtmp流媒体服务器

本文转自https://blog.csdn.net/jigetage/article/details/80813278?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160085322419195162109797%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160085322419195162109797&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduend~default-6-80813278.pc_v2_rank_blog_v1&utm_term=%E6%8E%A8%E6%B5%81&spm=1018.2118.3001.4187,仅作分享用

相关文章
|
5月前
|
网络协议 Linux 测试技术
音视频学习之rtsp推流学习1(rtspserver开源库example运行及流程梳理)
音视频学习之rtsp推流学习1(rtspserver开源库example运行及流程梳理)
359 0
语音直播源码知识分享:探索新的沟通方式
语音直播作为一种新兴的沟通方式,给用户带来了更加真实、亲近的交流体验。它不仅满足了人们对于实时沟通的需求,还促进了社交互动和多元化内容的传播。
语音直播源码知识分享:探索新的沟通方式
|
视频直播
视频直播源码技术知识分享:连麦功能(一)
我们开发视频直播平台就要去了解视频直播开发相关功能知识,这对我们开发平台有着重要的作用,连麦技术就是视频直播源码重要的技术功能之一,每一个功能技术都有自己的用武之地
视频直播源码技术知识分享:连麦功能(一)
|
边缘计算 编解码 监控
直播软件开发,低延时直播源码的特性分析
直播软件开发,低延时直播源码的特性分析
|
算法 语音技术
相亲源码开发语音连麦功能,语音连麦质量优化实践
相亲源码开发语音连麦功能,语音连麦质量优化实践
|
存储 数据采集 边缘计算
视频聊天源码以一对一直播为主,如何提高直播质量
视频聊天源码熟悉直播不仅要靠流媒体技术、服务器和CDN,还要使用多种功能机制,优化直播功能体验,比如减低直播延迟,提高直播间打开速度等。
|
消息中间件 编解码 移动开发
直播系统开发中音视频技术细节及消息发送流程
直播行业火爆的今天,让很多以为程序开发行业饱和人错失良机,今天的直播系统开发已经具备了成熟的运营模式,现在如果还想要搭建一套优秀的直播系统开发,除了选择安全可靠,售后保障完善的直播系统开发源码以外,还需要注意哪些重要的知识点呢?快来免费学习搭建直播系统开发中直播平台架构相关知识点吧!
直播系统开发中音视频技术细节及消息发送流程
|
Web App开发 编解码 负载均衡
一对一语音直播系统源码如何解决音视频直播技术难点
直播作为实时性和互动性要求较高的音视频应用场景,存在非常多的技术难点,就连一对一的直播模式也毫不例外。比如低延迟、流畅性、回声消除、国内外互通和海量并发等问题,都是开发过程中的难点。但是,在开发过程中如果具备了优质的一对一语音直播系统源码,那么这些难点可能都会得到一定的解决。
一对一语音直播系统源码如何解决音视频直播技术难点
|
存储 缓存 内存技术
直播软件开发的直播平台源码搭建中流媒体技术详解
随着移动互联网的发展,国内也涌现大大小小十几款视频直播app。以王思聪投资的17在2015年的爆红为代表,视频移动直播浮出水面,再到后来的映客、花椒、蜜友圈等等,直播自媒体时代的快速发展改变了人们传统的生活习惯和传统商业模式。
直播软件开发的直播平台源码搭建中流媒体技术详解
|
编解码 网络协议 API
直播系统开发之推流及拉流概述
直播系统开发推流端会根据当前上行网络情况控制音视频数据发包和编码,在网络较差的情况下,音视频数据发送不出去,造成数据滞留在本地,这时,会停掉编码器防止发送数据进一步滞留,同时会根据网络情况选择合适的策略控制音视频发送。