有没有办法在完全加载之前告诉 .ogg 视频的文件大小?

Posted

技术标签:

【中文标题】有没有办法在完全加载之前告诉 .ogg 视频的文件大小?【英文标题】:Is there a way to tell the file size of an .ogg video before it is fully loaded? 【发布时间】:2011-07-17 01:39:48 【问题描述】:

我知道 ogg 视频和 mp4 视频之间的一个区别是 ogg 视频没有描述文件大小的元数据,因此当加载 ogg 视频时,控件无法显示文件完全加载之前的剩余时间.如果 ogg 视频的长度超过几分钟,这可能会成为问题。有没有办法在请求页面时获取此文件大小?

(客户端开发人员,提出一个我认为有服务器端答案的问题。如果您能想出更具体的方法,我欢迎对这个问题提出修改建议。)

【问题讨论】:

【参考方案1】:

虽然不是最直接的,但你可以试试这个。

首先,设置一个.htaccess来透明地抓取所有.ogv视频并用php处理它们

.htaccess

RewriteEngine On
RewriteRule ^(.*)\.ogv$ ogv.php?file=$1

ogv.php

<?php
$file = $_GET['file'] . '.ogv';

while ( strpos($file, '..') !== false )

    $file = str_replace('..', '', $file);


$filesize = filesize($file);

header("Content-Type: video/ogg");
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: $filesize");
readfile($file);
exit()
?>

html

<video src="video.ogv" id="video" controls></video>

<script>
var video_src = document.getElementById('video').src;
var xhr = new XMLHttpRequest();
xhr.open('GET', video_src, false);
xhr.send(null);
var size = xhr.getResponseHeader('Content-Length');
alert(size);
</script>

以下是该系统的工作原理。只需像平常一样链接 .ogv 视频,但 .htaccess 文件首先捕获请求并将其发送到 ogv.php。然后,PHP 文件会专门发送一个文件大小标头,以防服务器不自动执行。好吧,那仍然对你没有多大好处,对吧?那么,您可以对视频发出 Ajax 请求并从 HTTP 标头中提取文件大小。

希望这会有所帮助。

【讨论】:

投了赞成票——就像答案一样,我认为它在正确的轨道上,但还没有准备好接受。当您说“以防服务器不自动发送文件大小标头”时,它通常会这样做吗?如果是这样,有没有办法读取该文件大小的标题?此外,当您说“从 HTTP 标头中提取文件大小”时,我认为这就是我最初想要做的,但我不确定如何做。 我明天会用一个实际的文件试试这个,看看我是否可以让它来填充 $filesize 数据。 现在最后的评论:你说“虽然不是最直接的”——什么最直接的?有没有我不知道的明显方法? 许多服务器只为图像发送文件大小标题...而不是为 HTML 和视频发送文件大小标题。这是一个小技巧。 javascript 大小变量以字节为单位保存文件大小,因此您可以对它做任何您想做的事情。最后,不,我想不出更好的方法,除非您可以完全访问服务器。这是一个 hack,但至少它应该在多种环境中工作。 我自己尝试过;它没有用,但我认为它在正确的轨道上。这就是问题所在(我认为):当 .htaccess 文件将 ogg 文件更改为 php 处理时,它会将 Content-Type 更改为 text/html。即使 php 文件试图将 header 设置为 video/ogg,它已经被设置了。

以上是关于有没有办法在完全加载之前告诉 .ogg 视频的文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

使用html5 video播放的视频加载很慢怎么优化

有没有办法在 HTML5 视频上使用 DRM?

如何在实际完全加载视频之前开始在 MediaPlayer 中播放视频

Video.js 中的 MP4 在完全加载之前不会播放

在渲染到屏幕之前对内存中的视频加载做出反应

使用ffmpeg转码的MP4文件需要加载完了才能播放的解决办法