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

简介: 直播过程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,仅作分享用

相关文章
|
4月前
|
Ubuntu Linux 图形学
Ubuntu 25.04:全新升级与未来展望
此外,Ubuntu 25.04还同步发布了众多官方衍生版本和支持周期,如Kubuntu、Xubuntu、Ubuntu MATE、Budgie、Unity、Studio、Cinnamon和Kylin等。用户可以从Ubuntu官网轻松下载这些版本。值得注意的是,作为一个非LTS版本,支持周期为9个月,预计将于2026年1月结束。因此,对于那些需要稳定性和长期支持的用户来说,Ubuntu 24.04 LTS仍然是一个推荐的选择。
|
5月前
|
Java Apache 开发者
解决java.lang.IllegalArgumentException: Invalid uri由无效查询引起的问题
最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。
583 20
|
4月前
|
定位技术 数据处理 API
手把手教你怎么做人口密度热力图
本文介绍了使用Python和ArcGIS绘制人口密度地图的方法。Python部分包括地图数据获取、格式转换、数据整合及可视化;ArcGIS部分涵盖地图投影、数据连接、人口密度计算与图例设置。同时提供了C++代码用于数据分割,并介绍了如何利用高德API获取地址经纬度,实现地图标注。
|
机器学习/深度学习 数据挖掘 PyTorch
🎓PyTorch深度学习入门课:编程小白也能玩转的高级数据分析术
踏入深度学习领域,即使是编程新手也能借助PyTorch这一强大工具,轻松解锁高级数据分析。PyTorch以简洁的API、动态计算图及灵活性著称,成为众多学者与工程师的首选。本文将带你从零开始,通过环境搭建、构建基础神经网络到进阶数据分析应用,逐步掌握PyTorch的核心技能。从安装配置到编写简单张量运算,再到实现神经网络模型,最后应用于图像分类等复杂任务,每个环节都配有示例代码,助你快速上手。实践出真知,不断尝试和调试将使你更深入地理解这些概念,开启深度学习之旅。
249 1
|
监控 Java 微服务
Spring Boot微服务部署与监控的实战指南
【7月更文挑战第19天】Spring Boot微服务的部署与监控是保障应用稳定运行和高效维护的重要环节。通过容器化部署和云平台支持,可以实现微服务的快速部署和弹性伸缩。而利用Actuator、Prometheus、Grafana等监控工具,可以实时获取应用的运行状态和性能指标,及时发现并解决问题。在实际操作中,还需根据应用的具体需求和场景,选择合适的部署和监控方案,以达到最佳效果。
|
存储 人工智能 搜索推荐
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一
本文详细介绍了第十一届泰迪杯数据挖掘挑战赛C题的解决方案,包括爬取泰迪内推平台的招聘与求职信息、构建企业和求职者画像、开发岗位匹配度与求职者满意度模型以及设计招聘求职双向推荐模型的步骤和Python代码实现。
230 2
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一
|
网络协议 网络性能优化 定位技术
ip呼叫是什么意思?
ip呼叫是什么意思?
|
存储 Java 程序员
Minio 小技巧 | 通过编码设置桶策略,实现分享永久可下载
Minio 小技巧 | 通过编码设置桶策略,实现分享永久可下载
1000 1
|
XML Java 数据格式
idea application context not configured for this file的问题的解决
idea application context not configured for this file的问题的解决
455 0

热门文章

最新文章