我已经尝试了几天的时间来解决这个问题,我尝试了
所有可以在stackoverflow和其他平台上找到的建议。但是,仍然
没有解决方案。
我正在通过HTML5视频标签嵌入视频:
<video poster="thumb.png" controls="controls" preload="none" width="640" height="480">
<source src="provider.php?secure=12345" type="video/mp4">
</video>
我尝试通过PHP交付MP4视频文件,而不是直接链接它。
直接链接mp4文件即可播放该文件!
测试:
视频文件:https : //github.com/q2apro/videotest-ipad/raw/master/video.mp4(在iPad上播放)
由PHP加载的具有相同标题的视频文件:https : //github.com/q2apro/videotest-ipad/blob/master/test-headers.php(不在iPad上播放)- 源代码
PHP加载的字节范围为字节的视频文件:https : //github.com/q2apro/videotest-ipad/blob/master/test-byterange.php(不在iPad上播放)- 源代码
由PHP使用字节范围(另一个脚本)加载的视频文件:https : //github.com/q2apro/videotest-ipad/blob/master/test-byterange-2.php(在iPad上不播放,警告“该操作可能尚未完成”)- 源代码
笔记:
上面的所有链接都无需嵌入标签即可直接访问/播放视频文件
视频可在Windows中的所有浏览器上运行(但不适用于iPad上的Safari / Chrome,也可能不适用于iPhone)
我的设置:
测试设备:iPad iOS 6(我没有Mac,无法调试)
装有Safari和Chrome的iPad(尝试使用两种浏览器)
我的服务器是来自domainfactory的共享主机
调试工具:Firefox 29 Web开发人员控制台/ WIN7
在.htaccess测试文件夹设置MIME类型,并接受-范围:
AddType video/mp4 .mp4
<IfModule mod_headers.c>
Header set Accept-Ranges "bytes"
</IfModule>
即使我创建了相同的标头(比较测试URL
1.和
2。),
iPad也无法通过PHP请求播放文件。
相反,我总是通过播放按钮获得删除线:
![ipad通过播放按钮删除](./ page_90_42_files / screenshot-
play- button.jpg)
1.的标头(直接mp4调用):
![mp4直接通话](https://raw.githubusercontent.com/q2apro/videotest-
ipad / master / screenshot-video-mp4-direct-call.png)
2.的标头与上面的标头相同,但是由PHP设置(由
PHP 提供的mp4 ):
![
在此处输入图片描述](https://raw.githubusercontent.com/q2apro/videotest-
ipad / master / screenshot-video-mp4-php-delivered.png)
-
我还尝试读取整个视频文件,并
使用PHP的fread(),
fpassthru()和
file_get_contents()将其发送到浏览器,但iPad始终显示不能播放的图标。
-
我的托管服务器不提供Connection保持活动状态,这可能是个
问题吗?iPad解释的.php和.mp4是否不同?
有人可以帮我摆脱痛苦吗?我完全被困住了。
PS:我想考虑的是:
字节范围请求(206部分内容)01 02 03
正确的视频编码04
测试时使用了其他编码视频
在PHP脚本中禁用了zlib.output_compression
更新:调试控制台
我终于得到了一个朋友的MAC,连接了iPad,
在Mac上的Safari中打开了调试控制台,在iPad 上加载了该页面,并检查
了Mac上出现的错误消息(顺便说一句,苹果会迫使我们
开发更复杂的东西吗?…)。对于所有测试脚本,都会出现此错误:
Failed to load resource: Plug-in handled load
1.第一个主要问题
事实证明,这不是编码问题,而是
在视频转换过程中设置的mp4容器标头存在问题-iPad显然对
准备进行渐进式流式传输的 MP4视频有问题。
首先,我在
这里的一次对话中发现了这一点。转换视频后,我总是使用工具
MP4快速启动来准备视频文件
以进行逐流播放。这是将视频文件
分段(逐步)传输到Flash Player 所必需的,因此它不会加载整个文件
(用户必须等待)。
对于手刹,有一个类似的设置,
称为Web Optimized。它的作用相同:
Web Optimized
Also known as "Fast Start"
This places the container header at the start of the file, optimizing it for streaming across the web.
如果启用此选项并转换视频,iPad将不会播放视频
文件!而是显示错误“操作无法完成”。
iPad删除线播放按钮
自己检查一下并进行测试:视频测试
资源。
2.第二个问题
在生产环境中,我始终使用PHP来检查引荐来源。我发现
,iPad不会发送引荐来源信息。这也可以防止
流式传输,并且您还将看到“不能播放”符号(“击中播放”
图标)。
3.第三个问题
我不知道为什么,但是iPad只接受来自
此脚本的视频流http://ideone.com/NPSlw5
<?php
// disable zlib so that progress bar of player shows up correctly
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
$folder = '.';
$filename = 'video.mp4';
$path = $folder.'/'.$filename;
// from: http://licson.net/post/stream-videos-php/
if (file_exists($path)) {
// Clears the cache and prevent unwanted output
ob_clean();
$mime = "video/mp4"; // The MIME type of the file, this should be replaced with your own.
$size = filesize($path); // The size of the file
// Send the content type header
header('Content-type: ' . $mime);
// Check if it's a HTTP range request
if(isset($_SERVER['HTTP_RANGE'])){
// Parse the range header to get the byte offset
$ranges = array_map(
'intval', // Parse the parts into integer
explode(
'-', // The range separator
substr($_SERVER['HTTP_RANGE'], 6) // Skip the `bytes=` part of the header
)
);
// If the last range param is empty, it means the EOF (End of File)
if(!$ranges[1]){
$ranges[1] = $size - 1;
}
// Send the appropriate headers
header('HTTP/1.1 206 Partial Content');
header('Accept-Ranges: bytes');
header('Content-Length: ' . ($ranges[1] - $ranges[0])); // The size of the range
// Send the ranges we offered
header(
sprintf(
'Content-Range: bytes %d-%d/%d', // The header format
$ranges[0], // The start range
$ranges[1], // The end range
$size // Total size of the file
)
);
// It's time to output the file
$f = fopen($path, 'rb'); // Open the file in binary mode
$chunkSize = 8192; // The size of each chunk to output
// Seek to the requested start range
fseek($f, $ranges[0]);
// Start outputting the data
while(true){
// Check if we have outputted all the data requested
if(ftell($f) >= $ranges[1]){
break;
}
// Output the data
echo fread($f, $chunkSize);
// Flush the buffer immediately
@ob_flush();
flush();
}
}
else {
// It's not a range request, output the file anyway
header('Content-Length: ' . $size);
// Read the file
@readfile($path);
// and flush the buffer
@ob_flush();
flush();
}
}
die();
?>
我希望这些信息可以帮助其他人解决这个问题。
更新:三个月后,在生产环境中,我的一些用户仍然报告了播放问题。Safari似乎还有另一个问题。我建议他们使用Chrome foriPad(已修复)。
PS:经过几天的研究,麻烦的是只能播放可以在所有其他设备上运行的视频文件。这再次向我证明,苹果之所以成功是因为出色的市场营销,而不是因为出色的软件。
问题内容: 我有一个要使用HTML5 标签在IE9中播放的mp4视频。我将MIME类型添加到了IIS 7中,因此,如果我浏览它可以在Chrome和IE9中播放,但不能在HTML5中播放,则Chrome会以HTML播放视频。这是代码: 有任何想法吗? 谢谢 更新: 在Firefox 5.0中尝试了相同的文件,但也无法正常工作,只有Chrome可以播放mp4视频。 问题答案: 最终使用http://v
我有一个响应站点,包含html5视频。我有一些javascript可以检查视频元素的大小是否低于某个阈值。如果是,它将移除控件,将视频播放按钮覆盖图像放置在视频元素的顶部,然后将click事件添加到保存视频元素的容器中。当点击容器时,它会将视频复制到一个模态对话框中并播放视频。 现在的困境是: webm版本没有任何问题。 modal视图的mp4版本在Safari中没有问题。 如果mp4播放到位(即
我想使用html5视频标签嵌入一个视频: https://dl.dropboxusercontent.com/u/64454818/TMP/P6135199.MOV 我使用对其进行了转换: FFMPEG输出: 我尝试将其嵌入如下: 然而,Chrome不播放视频,只提供下载(和我转换视频之前一样)。Firefox也有同样的问题。 我已经测试和其他mp4文件(从我的手机)播放得很好。 有什么问题吗?我
问题内容: 我遵循了一些有关结合JavaFX与Swing(JFrame)来播放视频的教程,但是我得到的只是一个黑屏,该视频应该没有任何实际的内容播放,也没有报错。 我在这里做错什么,为什么不播放视频? 我尝试了几个.flv视频,但都不会开始播放(当我在浏览器中打开它们时,它们会播放) 我在装有K-lite完整编解码器包的Windows 8.1 N Pro上运行jre7和jdk1.7.0_45 编辑
我检查过: 我查看了这个链接,上面有一个答案,说你必须将视频转换成块,并将块保存到firebase存储区,然后加载它们: 但我在这里迷失了: 谢谢你的努力。
我有以下功能,它获取一个WAV(PCM)文件并使用Android的MediaCode和MediaMuxer类将其编码为AAC编码的MP4文件。这只是音频。该函数成功运行并输出一个合理的. mp4,该函数被识别为AAC编码。但它不能在Android、Web或iOS播放器上播放,并使Audacy崩溃。我错过了什么吗?代码如下所示。