所以我正在处理的项目在服务器上已经有大量需要在嵌入式播放器中播放的 MP4 文件。理想情况下,我们希望使用已经为大多数视频设置的 JW Player。不幸的是,许多较旧的视频都是 MPEG-4 编码的,需要额外的插件才能在浏览器中播放。
我想做的是能够将这些视频即时转码为 JW Player 支持的格式,例如 H.264。现在,我已经成功了,因为我可以用它来转换旧的 MP4 文件,但是我很难将数据直接传递给播放器。
这是我当前进行转换的脚本(这是media_converted.php
):
<?php
error_reporting(0);
if (!isset($_GET["MediaName"])) {
$_GET["MediaName"] = "GSX238";
}
require_once("php/media_center_functions.php");
$MediaURL = ConstructVideoURLInternap($_GET["MediaName"]);
header("Content-Transfer-Encoding: binary");
//header('Content-type: video/mp4');
//$calculatedFileSize = filesize($MediaURL);
//header("Content-Length: {$calculatedFileSize}");
$cmd = 'ffmpeg -i "'.$MediaURL.'" -vcodec libx264 -acodec copy -f mp4 -moov_size 32000 "_temp/'.time().'_temp.mp4" 2> _temp/media_converter_output.txt';
passthru($cmd);
?>
我正在尝试获取上述文件并将其作为视频源传递给 JW Player:在 JW Player 的变量脚本中,如下所示:
so.addVariable('file','media_converted.php?MediaName=12345');
虽然我相信这应该可行,但事实并非如此。
即使转换似乎有效并且正在发送到播放器,也很难说,因为我认为浏览器正在尝试在播放任何内容之前下载整个文件。显然我不能让用户那样等待。
我研究了 qt-faststart,我能够在我的计算机上使用它来修改文件,以便它可以在加载时开始播放。不幸的是,这需要两个步骤。我首先必须完全转换文件,然后当它完成后,我必须在它上面使用 qt-faststart.exe。同样,这并不是真正的即时解决方案。我确信必须有某种方法可以在单个命令中产生类似的结果,然后输出给玩家……对吧?
服务器上的视频数据比我目前硬盘上的空间要多,所以要永久重新编码每个视频,即使是分批,也会很麻烦,因为我必须下载一些,转换,重新上传,下载更多,等等。如果我必须这样做,我会这样做,但我更愿意让它们保持原样并能够即时转码。
有任何想法吗?