IOS:Safari无法播放MP4(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.hqwc.cn/news/319477.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GAMES101-LAB3

一、作业总览 本次作业框架添加了Object Loader(用于加载三维模型), Vertex Shader 与Fragment Shader,并且支持了纹理映射。 需要完成的任务: 修改函数rasterize_triangle(const Triangle& t) in rasterizer.cpp 在此处实现与作业2类似的插值算法…

金和OA jc6 ntko-upload 任意文件上传漏洞

产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统升开发平台,电子政务一体化平台智慧电商平合等服务 漏洞概述 金和OA jc6系统ntkoUpload接口处存在任意文件上传漏洞&#xf…

21. Mysql 事件或定时任务,解放双手,轻松实现自动化

文章目录 概念常见操作事件调度器操作查看事件创建事件删除事件启动与关闭事件 精选示例构造实时数据定时统计数据 总结参考资料 概念 Mysql 事件是一种在特定时间点自动执行的数据库操作,也可以称呼为定时任务,它可以自动执行更新数据、插入数据、删除…

软件测试技术复习点

1 术语含义(故障、错误、失效、测试用例) 故障(Fault):故障是软件中的静态缺陷; 故障屏蔽:软件中的某个故障可能被其他一个或多个故障屏蔽; 错误(Error)&…

在docekr中运行openwrt镜像

1镜像下载 地址: https://archive.openwrt.org/releases/23.05.1/targets/x86/64/ #linux 下下载命令为 wget https://archive.openwrt.org/releases/23.05.1/targets/x86/64/openwrt-23.05.1-x86-64-rootfs.tar.gz ./#加载镜像 docker import openwrt-23.05.1-x…

基于ElementUI封装的下拉树选择可搜索单选多选清空功能

效果&#xff1a; 组件代码 /*** 树形下拉选择组件&#xff0c;下拉框展示树形结构&#xff0c;提供选择某节点功能&#xff0c;方便其他模块调用* author wy* date 2024-01-03 * 调用示例&#xff1a;* <tree-select * :height"400" // 下拉框中树形高度* …

springboot+redisTemplate多库操作

单库操作 我做了依赖管理&#xff0c;所以就不写版本号了添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>配置文件 spring:redis:database: 2…

mac环境下安装部署mysql5.7

下载安装包 进入官网下载MySQL5.7的安装包 https://www.mysql.com/downloads/ 安装包下载完成后双击pkg文件进行安装&#xff0c;无脑点下一步即可&#xff0c;注意安装完成后记得保存最后弹出框的密码 进入系统偏好设置&#xff0c;找到mysql&#xff0c;开启mysql服务…

【python入门】day12:bug及其处理思路

bug的常见类型 粗心 / 没有好习惯 思路不清 lst[{rating:[9.7,2062397],id:1292052,type:[犯罪,剧情],title:肖申克的救赎,actors:[蒂姆罗宾斯,摩根弗里曼]},{rating:[9.6,1528760],id:1291546,type:[剧情,爱情,同性],title:霸王别姬,actors:[张国荣 ,张丰毅 , 巩俐 ,葛优]},{r…

1-sql注入的概述

文章目录 SQL注入的概述web应用程序三层架构&#xff1a; 1、SQL注入之语句数据库1.1 关系型数据库1.2 非关系型数据库1.3 **数据库服务器层级关系&#xff1a;**SQL语句语法: 2、SQL注入之系统库2.1 系统库释义 SQL注入的概述 SQL注入即是指web应用程序对用户输入数据的合法性…

【算法挨揍日记】day34——647. 回文子串、5. 最长回文子串

647. 回文子串 647. 回文子串 题目描述&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&am…

2024年MySQL学习指南(二),探索MySQL数据库,掌握未来数据管理趋势

文章目录 前言4. DDL- 操作数据库4.1 查询4.2 创建数据库4.3 删除数据库4.4 使用数据库 5. DDL- 操作数据表5.1 数据类型5.2 查询表5.3 创建表5.4 删除表5.5 修改表 6. 实战案例详解 前言 接上一篇文章【2024年MySQL学习指南&#xff08;一&#xff09;】 4. DDL- 操作数据库 …