IOS:Safari无法播放MP4(H.264编码)

news/2024/7/20 23:00:08 标签: ios, safari, h.264

一、问题描述

MP4使用H.264编码通常具有良好的兼容性,因为H.264是一种广泛支持的视频编码标准。它可以在许多设备和平台上播放,包括电脑、移动设备和流媒体设备。

使用caniuse查询H.264兼容性,看似确实具有良好的兼容性:
在这里插入图片描述

然而,今天的前端小伙伴报告IOS上遇到MP4无法播放,而Android上能正常播放。

在这里插入图片描述

二、问题调查

首先排除MP4文件的存在及完整性,其次考虑:

1.MP4文件的编码

确认文件编码格式是否为H.264(目前H.265有比较大的兼容问题),那么如何确定文件的编码格式呢?
(1)mp4box.js查看MIME
测试网址:https://gpac.github.io/mp4box.js/test/filereader.html
在这里插入图片描述
如果一个MP4视频文件的编码格式为H.264,则其MIME是会包括avc这个字符串的,因此我们可以通过判断MIME中是否包含"avc"从而进行H.264视频编码格式的判断。例如:

不能在线播放的:audio/mp4; codecs="mp4v,mp4a.40.2,tmcd"; profiles="isom,iso2,mp41"
能在线播放的:video/mp4; codecs="avc1.640028,mp4a.40.2,tmcd"; profiles="isom,iso2,avc1,mp41"

(2)利用视频播放软件查看
①PotPlayer
在这里插入图片描述
②VLC media player
在这里插入图片描述
(3)利用ffprobe查看
需要先下载安装ffmpeg后使用命令(Windows下下载安装ffmpeg的方法后续文章给出):

ffprobe -show_streams 20230901-112105.mp4

在这里插入图片描述

更简洁的可以使用以下命令:

ffprobe -v error -select_streams v:0 -show_entries stream=profile,level -of default=noprint_wrappers=1 20230901-112105.mp4

在这里插入图片描述
注:ffproble的level=52,应该是对应的H.264标准中Level 5.2。关于这一点,可以从ffproble的文档里得出:

13.11 h264_metadata: 在这里插入图片描述

13.14 hevc_metadata:(H.265 / HEVC (High Efficiency Video Coding)在这里插入图片描述

上述两个截图,提到了两个字段:level_idc general_level_idc ,这两个分别与H.264和H.265的Level对应,并且对应关系不一样。general_level_idc 与H.265的Level对应关系如下:

在这里插入图片描述
codec标准要求level在存储的时候,会先乘以30。也就是general_level_idc =level*30,所以general_level_idc 为153时,对应的H.265的Level为:153/30=5.1

2.H.264的兼容问题

当使用H.264编码时,profile和level是指视频编码的配置参数,它们决定了视频的质量、兼容性和性能。具体来说,这些参数包括:

Profile(配置文件):指定了编码器可以使用的特定功能和算法,影响了视频的压缩效率和质量。常见的profile包括Baseline、Main和High。Baseline适用于较低质量的视频,Main适用于一般质量的视频,而High适用于高质量的视频。

Level(级别):指定了视频的参数,如分辨率、帧率和比特率的限制。不同的level对应不同的视频参数限制,例如Level 3.0适用于标清视频,Level 4.1适用于高清视频,Level 5.1适用于超高清视频。

选择合适的profile和level取决于视频的需求和目标平台的兼容性。例如,对于移动设备和低带宽环境,可以选择Baseline profile和较低的level,而对于高清视频和蓝光光盘,则可以选择High profile和更高的level。因此,根据具体的应用场景来选择合适的profile和level组合是非常重要的。

简单来说:
H.264的Profile和level 可以理解为 gzip的level, 等级越高,文件压缩得越小,传输越快,但cpu消耗越多。
Profile和level越高越好吗?压缩级别越高不仅在压缩时cpu的消耗越高,视频在播放时也需要消耗更多的cpu进行解压,各类型手机的硬件条件不一样,所以支持的压缩级别也不同。

通过苹果官方文档中ios能支持的视频格式可知,并不是所有h264编码的mp4文件都能在ios中播放:

在这里插入图片描述
从上可知,iphone4之后可以使用High Profile Level 4.1

三、解决方案

如果要保持MP4格式不变,针对IOS的兼容,需要将文件转换成High Profile Level 4.1

很多压缩软件或视频转码软件是没有Profile和level选项的,主要原因也是考虑到视频的压缩级别过高,在某些环境下无法播放。现在市场上流行的转码软件,在转码或压缩时:
1.有的不对Profile和level修改,直接进行有损压缩;
2.有的是直接转码为Main Profile level 3.1,是因为iPhone 4 支持的最高就是这个档位。

本文转换的方法使用ffmpeg(Windows下下载安装ffmpeg的方法后续文章给出):

ffmpeg -i 20230901-112105.mp4 -vcodec h264 -profile:v high -level 4.1 112105.mp4

在这里插入图片描述

最后使用ffprobe检查一下转换后的profile和level:

ffprobe -v error -select_streams v:0 -show_entries stream=profile,level -of default=noprint_wrappers=1 112105.mp4

在这里插入图片描述


http://www.niftyadmin.cn/n/5301800.html

相关文章

【算法每日一练]-dfs bfs(保姆级教程 篇8 )#01迷宫 #血色先锋队 #求先序排列 #取数游戏 #数的划分

目录 今日知识点: 使用并查集映射点,构造迷宫的连通块 vis计时数组要同步当回合的处理 递归求先序排列 基于不相邻的取数问题:dfs回溯 n个相同球放入k个相同盒子:dfs的优化分支暴力 01迷宫 血色先锋队 求先序排列 取数游…

PostgreSQL教程(一):前言

本文档基于9.6.x 版本! 何为PostgreSQL? PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,版本4.2为基础的对象关系型数据库管理系统(ORDBMS)。POSTGRES领先的许多概念在很久以后才出现在一些商业数据库中。…

vue 实现拐弯时间线,弯曲时间线,弯曲任务步骤条

需求&#xff1a; 实现可拐弯的步骤条功能 实现后效果如下&#xff1a; 代码部分&#xff1a; 创建步骤条组件Steps.vue <template><div><divstyle"width: 100%; display: flex; position: relative; margin-top: 20px"><div style"wi…

快讯|Tubi 与华纳兄弟探索公司拓展合作,​推出「超级英雄」系列内容

在每月一期的 Tubi 快讯中,你将全面及时地获取 Tubi 最新发展动态,欢迎🌟关注【比图科技】,一起成长变强! Tubi 与华纳兄弟探索公司拓展合作,推出超级英雄系列内容 Tubi 近日宣布与 Warner Bros. Discovery 华纳兄弟探索公司拓展了内容合作伙伴关系,Tubi 推出了 10 个…

2024年1月4日 晨会汇报

Good morning, colleagues! My report today consists of two parts: a summary of yesterday’s work and today’s work plan.Yesterday, I first addressed the bugs related to the facility rating and newsfeed features.Building on that, I kicked off a new iteratio…

kbdnecat.DLL文件缺失,软件或游戏无法启动运营,快速修复方法

“kbdnecat.DLL文件是什么&#xff1f;为什么一起动游戏或软件&#xff0c;Windows就报错“kbdnecat.DLL文件缺失&#xff0c;软件无法启动””&#xff0c;应该怎么修复呢&#xff1f; 首先&#xff0c;先来了解“kbdnecat.DLL文件”是什么&#xff1f; kbdnecat.DLL是一个动…

electron进程通信之预加载脚本和渲染进程对主进程通信

主进程和预加载脚本通信 主进程 mian,js 和预加载脚本preload.js,在主进程中创建预加载脚本, const createWindow () > {// Create the browser window.const mainWindow new BrowserWindow({width: 300,height: 300,// 指定预加载脚本webPreferences: {preload: path.j…

argparse学习使用

argparse学习使用 参数分为位置参数&#xff08;必须&#xff09;&#xff0c;关键词参数&#xff08;可选&#xff09;。 关键词参数开头必须是-或者–&#xff0c;后面名称可以随便填。可以填很多个&#xff0c;但是变量名是第一个。如果没传入&#xff0c;返回None 位置参…