iOS开发之iOS15.6之后拉流LFLiveKit,画面模糊及16.1马赛克问题

news2024/11/24 8:58:12

更新了iOS15.6系统后,发现拉取LFLiveKit进行直播的流,竟然是这样的:

模糊不清,于是思考是什么原因导致的。

1、是不是拉流端出现的问题?

使用安卓拉取iOS的直播流,是同样的效果,又考虑到两端使用的都是IJKPlayer播放器播放的,所以又用VLC进行拉流播放,还是同样的效果,最终排除。

2、 是不是服务端出现的问题?

安卓端推、拉流都是正常,没有问题,而且服务端只是做了一个流转发的过程,没有对数据进行任何处理,所以排出。

3、那只可能是推流端出现了问题。

但是代码是没有改过的,更新系统以后出现了问题,那只能是系统对编码器的参数设置进行了优化,可能是某些地方的参数值不适配或不够精确了。

模糊不清,是不是跟分辨率有关?我首先想到的是提高平均码率值和最小、最大码率值,然后在编码设置时,设置码率限制值,如下:

发现效果不是很明显,于是想是不是跟编码帧设置之前的参数有关,于是我研究了一下这些代码:

因为也有WebRTC的源码,于是进行了对比:

发现 presentationTimeStamp 这个参数的设置是不一样的,于是我按照WebRTC的方式进行修改,发现依然模糊不清。

接着查看源码注释:

/*!
	@function	VTCompressionSessionEncodeFrame
	@abstract
		Call this function to present frames to the compression session.
		Encoded frames may or may not be output before the function returns.
	@discussion
		The client should not modify the pixel data after making this call.
		The session and/or encoder will retain the image buffer as long as necessary. 
	@param	session
		The compression session.
	@param	imageBuffer
		A CVImageBuffer containing a video frame to be compressed.  
		Must have a nonzero reference count.
	@param	presentationTimeStamp
		The presentation timestamp for this frame, to be attached to the sample buffer.
		Each presentation timestamp passed to a session must be greater than the previous one.
	@param	duration
		The presentation duration for this frame, to be attached to the sample buffer.  
		If you do not have duration information, pass kCMTimeInvalid.
	@param	frameProperties
		Contains key/value pairs specifying additional properties for encoding this frame.
		Note that some session properties may also be changed between frames.
		Such changes have effect on subsequently encoded frames.
	@param	sourceFrameRefcon
		Your reference value for the frame, which will be passed to the output callback function.
	@param	infoFlagsOut
		Points to a VTEncodeInfoFlags to receive information about the encode operation.
		The kVTEncodeInfo_Asynchronous bit may be set if the encode is (or was) running
		asynchronously.
		The kVTEncodeInfo_FrameDropped bit may be set if the frame was dropped (synchronously).
		Pass NULL if you do not want to receive this information.
*/
VT_EXPORT OSStatus
VTCompressionSessionEncodeFrame(
	CM_NONNULL VTCompressionSessionRef	session,
	CM_NONNULL CVImageBufferRef			imageBuffer,
	CMTime								presentationTimeStamp,
	CMTime								duration, // may be kCMTimeInvalid
	CM_NULLABLE CFDictionaryRef			frameProperties,
	void * CM_NULLABLE					sourceFrameRefcon,
	VTEncodeInfoFlags * CM_NULLABLE		infoFlagsOut ) API_AVAILABLE(macosx(10.8), ios(8.0), tvos(10.2));

这个参数的意思是:

@param presentationTimeStamp

The presentation timestamp for this frame, to be attached to the sample buffer.Each presentation timestamp passed to a session must be greater than the previous one.

要附加到示例缓冲区的 此帧的 表示时间戳。传递给会话的每个演示时间戳必须大于上一个时间戳。

从设置的参数上来看是没有问题的,确实是大于上一个时间戳的,那么有没有可能是设置的数值间隔太大,所以导致缓冲区的内容太多,导致模糊不清,于是我将呈现时间的第二个参数改为视频的帧率,表示两个呈现时间中间只间隔一个帧率大小,而且修改为用每一个帧率大小标记一个可选关键帧,然后运行,发现拉流画面不再模糊不清,问题得以解决!

然后更新了iOS16.1.2系统以后,又出现了新的问题,竟然有大量马赛克,而且有时候只是最开始的画面是马赛克,后面画面就正常了,画面就是在不断的跳动,这又是怎么回事?于是又开始研究创建session前的设置参数,然后发现了这样一个参数值:

/*!
	@constant	kVTCompressionPropertyKey_AllowFrameReordering
	@abstract
		Enables frame reordering. 
	@discussion
		In order to encode B frames, a video encoder must reorder frames,
		which means that the order in which they will be emitted and
		stored (the decode order) is different from the order in which
		they were presented to the video encoder (the display order). 
		True by default.  Set this to false to prevent frame reordering.
*/
VT_EXPORT const CFStringRef kVTCompressionPropertyKey_AllowFrameReordering API_AVAILABLE(macosx(10.8), ios(8.0), tvos(10.2)); // Read/Write, CFBoolean, Optional, defaults to true

参数值的解释是:为了对B帧进行编码,视频编码器必须对帧进行重新排序,这意味着它们将被发送和存储的顺序(解码顺序)与它们被呈现给视频编码器的顺序(显示顺序)不同。默认情况下为True。将此设置为False以防止帧重新排序。

代码中就是将此值设置为了True,可能最开始写的时候因为对帧数据进行了排序,而且不理解此值的含义,之前的iOS系统并没有那么严谨,所以设置为True并没有出现问题,现在再看参数值的注释,代码确实设置错了,而且是根据时间戳创建的帧数据,所以也不需要排序。

最终修改此数值后,马赛克的问题得以解决!!

整理不易,转载请注明,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DL】Windows 10系统下安装TensorRT教程

Windows 10系统下安装TensorRT教程(手把手教程): Windows 10系统下安装TensorRT教程: 1.下载 https://developer.nvidia.com/nvidia-tensorrt-download EA 版本代表抢先体验(在正式发布之前)。 GA 代表通用性。表示稳定版,经过全面测试。 TensorRT、cuda、cudnn各版本…

与目前主流的消费返利平台对比,共享购模式有什么优势呢?

大家好,我是林工,之前几期内容都有介绍过共享购的商业模式,同时大家应该都对消费返利这方面有所了解。今天给大家分享一下整套模式的优劣势。 什么是消费返利?消费返利是互联网常见的一个商业模式,是指互联网平台将自…

毕业设计 基于STM32与wifi的天气预报网时钟系统 - 物联网 单片机

文章目录0 前言1 设计内容2 软件设计3 关键代码4 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不…

为社区成员提供的全新在线分析仪表板(Analytics Dashboard)!

开发者们大家好! 我们非常激动地与您分享我们为每个社区成员提供的在线分析仪表板(Online Analytics Dashboard)这一全新的强大功能🔥 从现在开始,您可以看到您自己的当周、月和所有时间的详细统计数据,包括: 浏览量&a…

The Sandbox Alpha 第三季排行榜公布

排行榜名单已经揭晓,祝贺所有玩家! Alpha 第三季已于 11 月 1 日落下帷幕,这是我们目前最大的一季活动,也是展示社区和合作伙伴在过去一年中所创造的诸多体验的机会。 这次也是我们测试新的「边玩边赚」机制的机会,其中…

Vue响应式系统的作用与实现(二)

响应式系统的作用与实现(二) 这章主要是介绍非原始值的响应式方案。 1.理解Proxy和Reflect: Vue3的响应式数据是基于Proxy实现的,那么我们非常有必要了解Proxy和Refelct。 参考资料:阮一峰的 官方参考资料 简单来…

Python Flask框架 入门详解与进阶

Python Flask框架 入门详解与进阶1.Flask框架 入门2.环境搭建2.1.安装flask1.创建虚拟环境2.激活虚拟环境3.安装flask2.2.flask程序编写1.创建test.py文件2.启动运行2.3.参数说明1.Flask对象的初始化参数第一种 :从配置对象中加载 app.config.from_object(DefaultCo…

chrome108 版本跨域问题

前言 近期,chrome又更新了,自动更新到了chrome的108.0.5359.95(正式版本) (64 位),更新到这个版本后,公司业务收到了一个故障,下面我们就来看看。背景: 客户…

Python——requests模块详解

1、模块说明 requests是使用Apache2 licensed 许可证的HTTP库。 用python编写。 比urllib2模块更简洁。 Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POS…

公众号查题系统

公众号查题系统 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击跳转…

Unity计算着色器 02

序 在百度了一下显卡以后,总结的话就是这个图。 这个图再总结的话就是左下角的那个框子,一个任务可以分为若干个线程组,每个线程组包含若干个线程。 两个若干,可以看成是两个变量,而且是有关系的——它俩乘积是一个…

如何使用PowerShell脚本进行数字签名?

如何对PowerShell脚本进行数字签名以进行身份验证和保护的快速指南。 您是否希望确保您的脚本可以安全使用并且没有被篡改,从而伤害用户?如果是这种情况,那么您将需要使用由已知证书颁发机构(如Sectigo、DigiCert)提供…

简谈Spring Boot3.0升级后的踩坑之旅,另附解决方案!

注:本文基于 newbeemall 项目升级Spring Boot3.0踩坑总结而来。 一. 编译报错,import javax.servlet.*; 不存在 这个报错主要是Spring Boot3.0已经为所有依赖项从 Java EE 迁移到 Jakarta EE API,导致 servlet 包名的修改,Sprin…

写了30000字 用 shell 脚本做自动化测试实战项目(全面、完整)

前言 项目中有一个功能,需要监控本地文件系统的变更,例如文件的增、删、改名、文件数据变动等等。之前只在 windows 上有实现,采用的是 iocp ReadDirectoryChanges 方案,现在随着整个应用移植到 mac 上,需要对这一部…

大数据智能交通未来会是怎样的交通状况?

大数据智能交通未来会是怎样的交通状况?智能交通也是智慧城市的一个重要组成部分将会改变我们的交通,交通少不了大数据的处理,人工智能自动驾驶离不开大数据的支撑。 实现智能交通需要高效地从海量数据中分析、挖掘所需的信息和规律&#xf…

缺少微信小程序测试经验?这篇文章带你从0开始

微信小程序已经越来越普遍,但目前接触小程序的项目相对较少,对小程序的特性也不了解,缺少小程序测试实战经验。 本文主要通过对微信小程序特性和测试点进行总结,储备测试知识,提高测试效率。 小程序发布审核 发布前…

Linux jprobe的使用和原理

文章目录前言一、demo1.1 demo演示1.2 struct jprobe二、jprobe 原理2.1 原理简介1.2 原理详解三、源码解析3.1 struct jprobe3.2 register_jprobe3.3 setjmp_pre_handler3.4 jprobe_return3.5 longjmp_break_handler四、Deprecated Features五、使用 perf-probe 获取函数参数总…

CentOS7一键安装OpenStack

环境 CentOS 7 CPU核心数:2x2 RAM:8G DISK:60G 问题说明 在安装openstack过程中,一直卡在下面过程: Testing if puppet apply is finished: 192.168.100.132_controller.pp [ | ]等待一会儿之后会报各种不同的错误…

crontab 实现秒级定时任务的执行(学习笔记)

crontab 实现秒级定时任务的执行 传统暴力法 crontab -e ***** /usr/bin/curl 地址 ***** sleep 10; /usr/bin/curl 地址 ***** sleep 20; /usr/bin/curl 地址地址 ***** sleep 30; /usr/bin/curl 地址 ***** sleep 40; /usr/bin/curl 地址 ***** sleep 50; /usr/bin/cu…

进程和计划任务管理

查看进程信息 ps ps命令 查看静态的进程统计信息 ps -elf 查看进程信息 top top命令 查看动态的进程排名信息 top 查看进程信息 pgrep pgrep命令 根据特定条件查询进程 PID 信息 pgrep -l “log” pgrep -l -U teacher -t tty1 查看进程信息 pstree pstree命令 以树…