iPad 不使用 HTML5 渲染 H.264 视频

Posted

技术标签:

【中文标题】iPad 不使用 HTML5 渲染 H.264 视频【英文标题】:iPad Doesn't Render H.264 Video with HTML5 【发布时间】:2011-09-19 20:11:14 【问题描述】:

我有一些 H.264 编码的视频可以在 Web 浏览器中以 html5 正确呈现,但在 iPad 上不能正确呈现。当我使用从 Internet 下载的 H.264 视频时,我的视频在 iPad 上可以正确呈现,所以这不是 HTML 问题。

这是关于我的视频的 ffmpeg 信息 --

我的原始 .mov 视频:

似乎流 1 编解码器帧速率与容器帧速率不同:6000.00 (6000/1) -> 30.00 (30/1)

输入 #0, mov,mp4,m4a,3gp,3g2,mj2, from 'a_video.mp4':

元数据:

major_brand     : qt  
minor_version   : 537199360
compatible_brands: qt  

时长:00:00:42.74,开始:0.000000,比特率:220 kb/s

Stream #0.0(eng): Audio: aac, 44100 Hz, stereo, s16, 94 kb/s
Stream #0.1(eng): Video: h264, yuv420p, 762x464, 122 kb/s, 30 fps, 30 tbr, 3k tbn, 6k tbc

使用 Handbrake 将我的 .mov 转换为 mp4 后,却无法在 iPad 上呈现:

似乎流 0 编解码器帧速率与容器帧速率不同:180000.00 (180000/1) -> 29.97 (30000/1001)

输入#0, mov,mp4,m4a,3gp,3g2,mj2, from 'a_video.m4v':

元数据:

major_brand     : mp42  
minor_version   : 0
compatible_brands: mp42isomavc1  
encoder: HandBrake 0.9.5 2011010300  

时长:00:00:42.77,开始:0.000000,比特率:169 kb/s

流 #0.0(und):视频:h264、yuv420p、752x464 [PAR 381:376 DAR 381:232]、35 kb/s、PAR 145161:141376 DAR 145161:87232、29.97 fps、29.97 tbr、90k tbn , 180k 待定 流 #0.1(eng):音频:aac,44100 Hz,立体声,s16,128 kb/s

这是我在网上找到的一个 .mp4,它可以在 iPad 上呈现:

似乎流 1 编解码器帧速率与容器帧速率不同:180000.00 (180000/1) -> 25.00 (25/1)

输入#0, mov,mp4,m4a,3gp,3g2,mj2, from 'a_video_3_emu.mp4':

元数据: major_brand : M4VP 次要版本:1 compatible_brands: M4VPM4A mp42isom 编码器:CoreMediaAuthoring 677、CoreMedia 420.17、i386

时长:00:01:38.01,开始:0.000000,比特率:1023 kb/s

流 #0.0(und):音频:aac,32000 Hz,单声道,s16,97 kb/s 流 #0.1(und):视频:h264、yuv420p、480x360 [PAR 1:1 DAR 4:3]、914 kb/s、25 fps、25 tbr、90k tbn、180k tbc

有人发现我的视频编码方式有问题吗?

编辑

起初我的理论是 iPad 对不同的容器格式很敏感;但情况似乎并非如此。我拍摄了一段在 iPad 上正确渲染的视频并将其转换为 .mov,并且它仍然在 iPad 上正确播放。所以 iPad 处理底层 H.264 流的方式肯定有问题。

【问题讨论】:

在桌面浏览器上查看页面时 mp4 是否有效? 是的。这只发生在 iPad 上。它与 mp4 与 m4v 有关。 我刚刚在 iPad 上渲染的视频上运行了这个命令: ffmpeg -i a_video_3_emu.mp4 -acodec copy -vcodec mpeg4 output.mp4 。 output.mp4 仍然可以在 iPad 上运行。看起来这可能不是容器问题,而是底层流。 【参考方案1】:

如果您有一个 H.264 视频流 - 无论容器(mov、m4v、mp4)如何 - 并且您的 HTML5 视频在网络浏览器中呈现但不在 iPad 上呈现,有两种可能的修复方法:

第一种方案是将H.264视频流转成mpeg4。

ffmpeg -i video_h264_not_working.mov -acodec copy -vcodec mpeg4 video_mpeg.mov

(或者,您可以在 Handbrake 中选择 MPEG4 而不是 H.264。)

第二种方案是重新处理H.264视频,参数如下:

ffmpeg -i video_h264_not_working.mov -vcodec libx264 -r 25 -b 516k -bt 516k -crf 22 -vpre normal video_h264.mov

第二个解决方案来自:http://houseoflaudanum.com/navigate/howtos/html5-video-no-webm/

我猜在前一种情况下,mpeg4 编解码器在 iPad 上更轻松;在后一种情况下,iPad 不喜欢原始 H.264 编码中的某些流参数,因此需要“清理”。

要确定您的视频流实际上是什么,只需执行 ffmpeg -i myvideo.mov。

【讨论】:

【参考方案2】:

按照 Mark Pilgrim 在Video on the Web section of Dive Into HTML5 中的建议,我使用免费的Miro Video Converter(OS X、Windows)在编码和转码 HTML5 视频方面取得了巨大成功。

Miro Video Converter 几乎可以将任何视频文件转换为 MP4、Theora 或 MP3(仅限音频)。它具有预设,可将视频转换为适用于流行手机、iPod 和其他媒体播放器的正确尺寸和格式。只需转换您的视频并将其复制到您的设备即可。

这是一种超级简单的方法,可以将几乎任何视频转换为 MP4、WebM (vp8)、Ogg Theora 或 android、iPhone 等。你会觉得它是 100% 免费和开源的。

另一个名副其实的视频转换实用程序是Video Monkey,这是一款专为 Mac 设计的免费视频编码应用程序。它是在伟大的工具 Visual Hub 消亡后创建的。 Video Monkey 大量借鉴了 Visual Hub 视频转换工具,无论是从概念上还是从作为 TranscoderRedux 发布到 SourceForge 的原始代码转储中。

【讨论】:

我也有同样的问题。米罗不行。事实上,当我将 .wmv 转换为 .webm 以便与 Chrome 一起使用时,它会崩溃。 (供参考:Handbrake 和 VLC 也不适用于 iPad,但两者都可以制作适用于 Chrome 的各种格式的视频)【参考方案3】:

sudo port install ffmpeg 试试这个秘方:

#!/bin/bash
BR=512k
WIDTH=640
HEIGHT=272
input=$1

# strip off the file extension
output=$(echo $input | sed 's/\..*//' )

# works for most videos
ffmpeg -y -i $input -f mpegts -acodec libmp3lame -ar 48000 -ab 64k -s $WIDTHx$HEIGHT -vcodec libx264 -b $BR -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 7 -trellis 0 -refs 0 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate $BR -bufsize $BR -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 30 -qmax 51 -qdiff 4 -level 30 -aspect $WIDTH:$HEIGHT -g 30 -async 2 $output-iphone.ts

调整原始视频的宽度和高度,并根据需要设置比特率。将原始视频作为参数传递给脚本。适用于几乎任何源格式。端口命令需要macports。

【讨论】:

以上是关于iPad 不使用 HTML5 渲染 H.264 视频的主要内容,如果未能解决你的问题,请参考以下文章

H.264从SPS中提取视频宽高

视音频数据处理入门:H.264视频码流解析

如何(伪)流式传输 H.264 视频 - 以跨浏览器和 html5 方式?

ffmpeg 转换命令输出到 iPad 的 h.264

在 Internet Explorer 9 中使用 HTML5 实时流式传输 h.264

FFMPEG - 更正命令行参数以从一组图像创建 H.264 流 MP4