解决部分mp4视频在ios上无法播放问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决部分mp4视频在ios上无法播放问题相关的知识,希望对你有一定的参考价值。
参考技术A mp4视频在安卓上全部能播放,部分mp4视频在ios不能播放。表现为刚开始缓冲加载几秒钟后,就显示加载失败的图标了,或者直接显示加载失败图标查阅了许多资料后,感谢在这篇文章中得到了一些启示 https://www.cnblogs.com/aleafo/p/7644553.html 。文中言简意骇的指出是“h264编码的压缩级别问题导致“
通过某种特定的压缩技术,将某个视频格式的文件转换为另一种视频格式的文件的技术称为视频编码。h264是视频流中其中一种编码标准。H264编码profile & level 控制 https://www.cnblogs.com/tinywan/p/6402007.html ,这里面说到H264编码的压缩级别,从压缩比例来说,baseline< main < high,对于带宽比较局限的在线视频,可能会优先选择high。但是上文说到,部分mp4视频不能在ios上播放,是由于h264编码的压缩比导致的,那么我们怎么知道ios支持哪些压缩级别呢?
虽然协议规范没有限制视频和音频格式,但目前的苹果实现支持以下格式( https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html )
可能这个很久没有更新了哈,一些文档已经说明了h264的 Profile Level可以达到了5.2
可以对mp4文件右键显示简介,会有一个参数“编解码器:H.264, AAC”
emmmmm...正在解决中,后续会更新文档。但是建议你们先尝试,广大群众知道的话,给个回应呐,嘻嘻~
1.文件从哪儿来的,去源头问下(当然这个我问过了,他们自己都不知道压缩界别是多少,只是说软件会优先选择压缩级别,emmmm)
2.windows系统可以利用potplayer等软件,查看对应的mp4文件的压缩级别(目前没试过)
3.mac os 可以利用handbrake软件试试看,目前我试了,没查看到压缩级别
1.自己转:在提供视频时,最好让提供者在压缩的时候,不要选择high4.2以上的(也不要优先选择,也可能会造成优先选择更高的压缩级别)
2.第三方:有时会把视频上传到第三方,例如又拍云,七牛云等,他们会有一个转码的服务,不同的第三方,可以参考开发文档看下,或者联系客服。对于又拍云,在转码的时候会加上level这个参数 https://docs.upyun.com/cloud/av/#_11
mp4在安卓上可以播放,但部分mp4在ios上不可播放的视频,需要查看该视频的压缩级别。
Android:无法播放 mp4 视频
【中文标题】Android:无法播放 mp4 视频【英文标题】:Android: cannot play mp4 video 【发布时间】:2011-12-22 10:14:34 【问题描述】:我正在尝试使用本机 VideoView 从服务器播放 mp4 视频流,遗憾的是我不断收到“无法播放视频”错误。
奇怪的是,相同的视频在 Froyo 上播放良好,但在 HoneyComb 上却无法播放。 我用 MX 视频播放器(在 HC 上)尝试了相同的视频,它播放得很好。
另一个主要问题是我无法重新编码视频,所以我必须按原样使用视频。
是什么导致了错误? 如何播放视频? 我应该想办法将编解码器库包含到我的应用中吗?以下是来自 logcat 的详细信息:
E/MediaExtractor( 242): **********MediaExtractor::Create
D/DivXPlugin( 241): DivXPlugin::onInitialize : 75
D/DivXPlugin( 241): DivXPlugin::onSetOnInfoListener : 75
D/DivXPlugin( 241): DivXPlugin::onOpenDecryptSession: Enter : 75
E/DivXPlugin( 241): DivXPlugin::onOpenDecryptSession() Not a Divx File.
E/DrmManager(Native)( 241): DrmManager::openDecryptSession: no capable plug-in found
D/DivXPlugin( 241): DivXPlugin::onTerminate : 75
E/MediaExtractor( 242): ************Autodetected media content as 'video/mpeg4' with confidence 0.40
D/AwesomePlayer( 242): finishSetDataSource_l getDrmInfo
D/AwesomePlayer( 242): setDataSource_l
E/MPEG4Extractor( 242): ftyp chunk found
D/MPEG4Extractor( 242): kKeyAVCC found
E/MPEG4Extractor( 242): ERROR_MALFORMED because ret=-108
E/MPEG4Extractor( 242): return ERROR_UNSUPPORTED
E/MPEG4Extractor( 242): return ERROR_UNSUPPORTED
D/AwesomePlayer( 242): UNKNOWN_ERROR: no Video and no Audio
D/AwesomePlayer( 242): abortPrepare
D/AwesomePlayer( 242): notifyListener_l
E/MediaPlayer( 3906): error (1, -2147483648)
E/MediaPlayer( 3906): Error (1,-2147483648)
D/VideoView( 3906): Error: 1,-2147483648
以及无法播放的视频规格: 一般的 格式:MPEG-4 格式配置文件:基础媒体 编解码器 ID:isom 文件大小:60.7 MiB 时长:700万3秒 整体比特率模式:可变 总比特率:1 201 Kbps 编写应用程序:Lavf52.37.0 视频 编号:1 格式:AVC 格式/信息:高级视频编解码器 格式配置文件:High@L3.1 格式设置,CABAC:是 格式设置,ReFrames:4 帧 编解码器 ID:avc1 编解码器 ID/信息:高级视频编码 时长:700万3秒 Duration_FirstFrame : 40 毫秒 比特率:1 072 Kbps 宽度:1 024 像素 高度:576 像素 显示纵横比:16:9 帧率模式:恒定 帧速率:25.000 fps 色彩空间:YUV 色度二次采样:4:2:0 位深:8位 扫描类型:逐行扫描 比特/(像素*帧):0.073 流大小:54.2 MiB (89%) 编写库:x264 core 65 r0+1016 dbc5ef0 编码设置:cabac=1 / ref=4 / deblock=1:0:0 / analyse=0x3:0x113 / me=umh / subme=8 / psy_rd=1.0:0.0 / mixed_ref=1 / me_range=16 / chroma_me=1 / 格子=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / chroma_qp_offset=-2 / threads=6 / nr=0 / decimate=1 / mbaff=0 / bframes=16 / b_pyramid=0 / b_adapt= 1 / b_bias=0 / direct=3 / wpredb=1 / keyint=125 / keyint_min=25 / scenecut=40(pre) / rc=2pass / bitrate=1072 / ratetol=1.0 / qcomp=0.80 / qpmin=10 / qpmax =51 / qpstep=4 / cplxblur=20.0 / qblur=0.5 / ip_ratio=1.41 / pb_ratio=1.25 / aq=1:1.00 英语语言 声音的 编号:2 格式:AAC 格式/信息:高级音频编解码器 格式配置文件:LC 编解码器 ID:40 时长:700万3秒 比特率模式:可变 比特率:122 Kbps 频道:2 个频道 通道位置:前:L R 采样率:48.0 KHz 压缩模式:有损 流大小:6.18 MiB (10%) 英语语言
【问题讨论】:
我正在考虑将 ffmpeg 库添加到我的应用程序中,但我对 android NDK 知之甚少。任何人有提示或链接提供? 【参考方案1】:问题可能出在视频编码上。 Android FROYO 和 Gingerbread 不支持 "Baseline" H264 以外的 H264 格式。因此,如果您的视频是 Mp4 和 H264 编码,请确保其“AVC 基线”编码。在 windows/Linux 中使用“媒体信息”等工具并检查您的视频编码。
【讨论】:
【参考方案2】:一些 Froyo 设备(例如,三星 Galaxy Tab)使用 OpenCore 媒体框架,而其他设备则使用 Stagefright。从姜饼到我所知道的所有设备都使用 Stagefright。所以这也许可以解释你的经历。
通过 HTTP 或 RSTP 播放时,视频容器有额外的限制。
来自开发者文档:
对于 3GPP 和 MPEG-4 容器,moov atom 必须位于任何 mdat 之前 原子,但必须在 ftyp 原子之后。
【讨论】:
以上是关于解决部分mp4视频在ios上无法播放问题的主要内容,如果未能解决你的问题,请参考以下文章
音视频开发之旅(64) - 部分android手机编码的视频在ios上无法播放
音视频开发之旅(64) - 部分android手机编码的视频在ios上无法播放