zoukankan      html  css  js  c++  java
  • 直播软件开发推流过程详解

    直播过程

    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,仅作分享用

  • 相关阅读:
    聪明人 & 普通人
    13种模型及方法论
    面向大规模商业系统的数据库设计和实践
    分治算法
    软件架构
    隐含前提思维模型
    Git回滚代码到某个commit
    使用arthas排查 test 问题
    Arthas
    docker 操作入门
  • 原文地址:https://www.cnblogs.com/yunbao/p/13719789.html
Copyright © 2011-2022 走看看