OpenHarmony鸿蒙( Beta5.0)RTSPServer实现播放视频详解

  鸿蒙开发往期必看:

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)

 “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路径!


概述

openharmony中实现RTSPServer播放视频主要分为如下5部分。其中视频采集与视频编码平台芯片3518EV300与3516DV300已支持,将编码后的视频数据(H.265)存放至环形缓冲区,最后通过RTSPServer发送,RTSPClient由VLC播放器实现。

RTSPServer实现

RTSP流媒体播放实现主要涉及两个线程:1、将编码后的视频数据存储在环形缓冲区内。2、创建RTSPServer发送环形缓冲区数据。

环形缓冲区

环形缓冲区主要目的是为了将视频编码(H.265)产生的数据通过RTSPServer实时地发送到RTSPClient端。

H.265数据原理

H.265=若干序列集。

序列集=1IDR帧+1VPS帧+1SPS帧+1PPS帧+1SEI帧+若干P帧组成。

每帧通过00 00 00 01分割以后的下一个字节就是NALU(网络抽象层单元)类型,

  • 1: 00 00 00 01 40 01 .... ,(0x40 & 0x7E)>> 1 值为 32, 语义为视频参数集 VPS
  • 2: 00 00 00 01 42 01 .... ,(0x42 & 0x7E)>> 1 值为 33, 语义为序列参数集 SPS
  • 3: 00 00 00 01 44 01 .... ,(0x44 & 0x7E)>> 1 值为 34, 语义为图像参数集 PPS
  • 4: 00 00 00 01 4E 01 ....,(0x4E & 0x7E)>> 1 值为 39, 语义为补充加强信息 SEI
  • 5: 00 00 00 01 26 01 .... ,(0x26 & 0x7E)>> 1 值为 19, 语义为可能有RADL图像的IDR图像的SS编码数据 IDR
  • 6: 00 00 00 01 02 01 .... ,(0x02 & 0x7E)>> 1 值为 1, 语义为被参考的后置图像P帧

如下图,左边是h265原始数据,右边是通过RTP发送去掉头数据。

在进行RTP分包发送时会将IDR、VPS、SPS、PPS、SEI拼凑为一起作为主要帧发送,因此头一帧数据 非常重要。

为了解决视频编码与RTSP线程线程同步的问题,缓冲区设计如下:

文件路径:recorder_impl.cpp	
实现函数:void VideoSourceProcess(const SourceManager *videoSourceManager, const RecorderSink *recorderSink)

缓冲区为16*256K长度的数组buff。put为编码线程存放缓冲区偏移值,get为RTSPServer线程获取缓冲区的偏移值。

初始情况下put与get的位置均在开头。

当视频编码有数据时填充buff并put向前移。

RTSP通过get将视频编码数据发送,然后释放buff,get向前移。

当put与get偏移超过16时重新置1,其中设置get数据的时间get与put的间隔不会超过3个buff。

RTSPServer

RTSP(Real Time Streaming Protocol)实时流协议作为一个应用层协议,RTSP提供了一个可供扩展的框架,它的意义在于使得实时流媒体数据的受控和点播变得可能。总的说来,RTSP是一个流媒体表示协议,通过RTSP传输控制命令与RTP传输视频流达到控制具有实时特性的数据发送。RTSP可以对流媒体提供诸如播放、暂停、快进等操作,它负责定义具体的控制消息、操作方法、状态码等,此外还描述了与RTP间的交互操作。

RTSP C(Client)与 S(Server)交互流程图解

RTSP 中的 C(Client)与 S(Server)交互流程图解

RTSP 关键字段说明
关键字:OPTIONS

得到服务器提供的可用方法(OPTION、DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE、SCALE、GET_PARAMETER、SET_PARAMETER)。

关键字:DESCRIBE

请求流的 SDP 信息。

注解:此处需要了解 H265 Law Data 如何生成 SPS PPS 信息。

关键字:SETUP

客户端提醒服务器建立会话,并建立传输模式。

注解:此处确定了 RTP 传输交互式采用 TCP(面向连接)还是 UDP(无连接)模式。

关键字:PLAY

客户端发送播放请求。

注解:此处引入 RTP 协议。

关键字:PAUSE

播放暂停请求。

注解:此关键字经常用在录像回放当中,实时视频流几乎用不到。

关键字:TEARDOWN

客户端发送关闭请求

RTP分包

其中RtpHeader(Rtp头)加payload(负载数据)。

RtpHeader数据
csrcLen  CSC计数,在没有RTP混频器的情况下通常为0
extension 扩展名,必须为0
padding 填充位,不得使用填充,默认为0
version  版本号payloadType 数据帧类型(h265)。
marker 将一帧分片时区分头片seq 序列号为了以每片为单位timestamp 时间戳 以每帧为单位ssrc  数据信源号
payload数据

RTP包最大为1400个字节,因此打包分为两种。

  1. 一种是一个nal单元打包到一个rtp包中。
  2. 一种是nal单元比较大,分片打包在多个rtp中。

单个nal直接发送即可

nal单元比较大,分片打包在多个rtp中,分片格式如下:

其中PayloadHdr固定为49。FUheader数据为:

S置1表示起始片,E置1表示最后片,FuType就是实际的Nal type类型。

实现代码函数

文件:rtp.cpp
实现函数:int Rtp::UdpSendFrame(uint8_t *pNalBuf, int s32NalBufSize)

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线图、文档、视频、用来跟着学习是非常有必要的。

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙全栈开发学习笔记   希望这一份鸿蒙学习文档能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频教程+学习PDF文档

鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)

                   

鸿蒙APP开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线


http://www.ppmy.cn/news/1526711.html

相关文章

Java学习线路(2024版)

Java 作为一门成熟、强大且灵活的编程语言,广泛应用于企业级开发、Web开发、移动开发、大数据等领域。随着技术的不断演进,Java 生态系统不断扩展,学习路径也随之更新。如果你想全面掌握 Java,从基础开始到精通,再到最…

【Elasticsearch系列六】系统命令API

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

一起对话式学习-机器学习02——机器学习方法三要素

【一】核方法 首先补充一下核方法,这应是机器学习分类中的内容。 什么是核方法呢?听起来很高级,但理解很简单: 官方定义:核方法是使用核函数表示和学习非线性模型的一种机器学习方法,可以用于监督学习和非监…

初学Linux(学习笔记)

初学Linux(学习笔记) 前言 本文跳过了Linux前期的环境准备,直接从知识点和指令开始。 知识点: 1.目录文件夹(Windows) 2.文件内容属性 3.在Windows当中区分文件类型是通过后缀,而Linux是通过…

C++ ——string的模拟实现

目录 前言 浅记 1. reserve(扩容) 2. push_back(尾插) 3. iterator(迭代器) 4. append(尾插一个字符串) 5. insert 5.1 按pos位插入一个字符 5.2 按pos位插入一个字符串 …

JVM面试真题总结(九)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 描述CMS垃圾收集的工作过程 CMS(Concurrent Mark Swee…

Eclipse 数据空间组件(EDC)项目介绍

探索数据共享新时代——Eclipse 数据空间组件(EDC)项目介绍 在当今数字经济的背景下,数据成为了新的“石油”。但与石油不同的是,数据可以无限共享且再生。然而,如何在保持数据主权的前提下实现高效、安全的数据共享&…

Redis 字典的哈希函数和 rehash 操作详解

Redis 字典的哈希函数和 rehash 操作详解 在 Redis 中,字典(Hash Table)是一种重要的数据结构,用于存储键值对。下面解释 Redis 字典的哈希函数和 rehash 操作。 一、哈希函数 作用 Redis 的字典使用哈希函数将键转换为一个整数索引,这个索引用于确定键值对在哈希表中的…

大众萨克森:SNP助力汽车制造智能化,实现SAP S/4HANA系统成功升级

关于大众萨克森 VW Sachsen 大众汽车(Volkswagen Sachsen GmbH)包括位于德国茨维考的汽车工厂、位于德累斯顿的透明工厂和位于开姆尼茨的发动机工厂。茨维考汽车厂拥有 7,900名员工,每天生产1,350辆高尔夫和帕萨特汽车。在开姆尼茨的发动机工…

k8s 容忍和污点

文章目录 Taint作用在节点上,能够使节点排斥一类特定的Pod,也就是不能“兼容”该节点的污点的Pod。对应的Toleration作用在Pod上,意为容忍,也就是可以兼容某类污点。 给节点增加一个Taint也很简单,直接使用kubectl ta…

eclipse配置maven

eclipse配置maven 启动 Eclipse,转到 Window > Preferences 在左侧导航栏中,展开 Maven 节点。 在 User Settings 下,单击 Add。 浏览到 Maven 安装目录中 conf/settings.xml 文件。 在 Global Settings 下,单击 Add。 浏览到…

React源码学习(一):如何学习React源码

本系列源码学习,是基于 v16.13.1,v17.x与v16.x区别并不太大! 一、如何正确的学习React源码? 找到Github,转到React仓库,fork / clone源码:React 查看Readme,在Documentation中有Cont…

如何选择大带宽服务器租用

大带宽服务器能够为企业和用户提供网络性能,让用户可以快速的传输数据信息,保证服务器的稳定性,那企业在进行选择大带宽服务器租用,应该考虑到哪些因素呢? 对于大带宽服务器的选择,企业首先要明确自身的业务…

seafaring靶场渗透测试

1.sql注入漏洞 进来这里有个框 尝试xss没有那咱们就来试试搜索行注入 这里有东西说明闭合成功,接着就order by 有三列 三个地方都有回显 查看数据库 这里查表发现只有两个 先去看看admin先来看看列 然后看用户密码,这里密码直接显示出来了 2.文件上传漏…

(1)CLIP

CLIP 概述1. 训练与推理2. 最终效果与局限性3.后续应用3.1 DALL-E3.2 ActionCLIP3.3 CLIP-Event 概述 CLIP:contrastive language-image pretraining 利用文本的监督信号训练一个迁移能力特别强的视觉模型 传统的视觉模型,人工标注图像,那么…

Spring Boot- 配置文件问题

Spring Boot 配置文件问题探讨 Spring Boot 是目前主流的 Java 开发框架之一,其核心特性之一便是“约定优于配置”(Convention over Configuration)。在此基础上,Spring Boot 提供了灵活而强大的配置文件机制,帮助开发…

基于单片机的风机故障检测装置的设计与实现(论文+源码)

1 系统总体设计方案 通过对风机故障检测装置的设计与实现的需求、可行性进行分析,本设计风机故障检测装置的设计与实现的系统总体架构设计如图2-1所示,系统风机故障检测装置采用STM32F103单片机作为控制器,并通过DS18B20温度传感器、ACS712电…

Elasticsearch之bool查询

bool 查询是 Elasticsearch 中最常用的复合查询类型,允许将多个查询组合在一起。它通过逻辑操作符(如 must、should、must_not 和 filter)来构建复杂的查询条件,从而满足多条件匹配、逻辑与(AND)、或&#…

成型的程序

加一个提示信息 加上python 常用的包 整个程序打包完 250M 安装 960MB matplot numpy pandas scapy pysearial 常用的包 (pyvisa)… … 啥都有 Python 解释器组件构建 要比 lua 容易的多 (C/Rust 的组件库)

Kotlin 极简小抄 P1(变量与常量、基本数据类型、流程控制)

一、Kotlin Kotlin 由 JetBrains 开发,是一种在 JVM(Java 虚拟机)上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性,同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言,也可以…