Adobe 如何将F4F文件转换为MP4?
我们知道F4F是Adobe针对HTTP动态流的碎片化MP4文件格式。名为F4F Packager的工具可以将F4V文件转换为多个F4F文件和清单文件(F4M)Adobe 如何将F4F文件转换为MP4?,adobe,Adobe,我们知道F4F是Adobe针对HTTP动态流的碎片化MP4文件格式。名为F4F Packager的工具可以将F4V文件转换为多个F4F文件和清单文件(F4M) 我的问题是,如何将这些F4F文件转换回F4V或MP4文件?我们终于找到了一种合并和转换.F4F文件->.flv文件的简单方法,其中只有“mdat”框可用。以下是php代码的示例: <?php function ReadInt24($str, $pos) { return intval(bin2hex(subs
我的问题是,如何将这些F4F文件转换回F4V或MP4文件?我们终于找到了一种合并和转换.F4F文件->.flv文件的简单方法,其中只有“mdat”框可用。以下是php代码的示例:
<?php
function ReadInt24($str, $pos)
{
return intval(bin2hex(substr($str, $pos, 3)), 16);
}
function ReadInt32($str, $pos)
{
return unpack("N", substr($str, $pos, 4))[1];
}
echo "\nKSV Adobe HDS Downloader\n\n";
$flvHeader = hex2bin("464c5601050000000900000000");
$firstVideoPacket = true;
$prevTagSize = 4;
$fragCount = 0;
isset($argv[1]) ? $baseFilename = $argv[1] : $baseFilename = "";
$baseFilename ? $outputFile = "$baseFilename.flv" : $outputFile = "Joined.flv";
while (true)
{
if (file_exists("$baseFilename" . $fragCount + 1 . ".f4f"))
$fragCount++;
else
break;
}
echo "Found $fragCount fragments\n";
$flv = fopen("$outputFile", "wb");
fwrite($flv, $flvHeader, 13);
for ($i = 1; $i <= $fragCount; $i++)
{
$frag = file_get_contents("$baseFilename$i.f4f");
preg_match('/(.{4})mdat[\x08\x09\x12]/i', $frag, $mdat, PREG_OFFSET_CAPTURE);
$fragLen = ReadInt32($mdat[1][0], 0) - 8;
$frag = substr($frag, $mdat[1][1] + 8, $fragLen);
$pos = 0;
while ($pos < $fragLen)
{
$packetType = $frag[$pos];
$packetSize = ReadInt24($frag, $pos + 1);
$packetTS = ReadInt24($frag, $pos + 4);
$totalTagLen = 11 + $packetSize + $prevTagSize;
if (($packetType == "\x08" && $packetSize > 4) or ($packetType == "\x09" && $packetSize > 40) or ($packetType == "\x09" && $firstVideoPacket))
{
if ($packetType == "\x09" && $firstVideoPacket)
$firstVideoPacket = false;
fwrite($flv, substr($frag, $pos, $totalTagLen), $totalTagLen);
}
$pos += $totalTagLen;
}
}
fclose($flv);
echo "Finished\n";
?>
这里有一个更全面的答案: 严重的事情发生了。 此脚本处理的案例比当前的顶级答案多。我不会在这里发布整个脚本,因为它有点长
唉,这也是一个PHP脚本,尽管我可能需要在几周内用Java重写它。如果是这样,我会在Java重写完成后发布一个链接。livestreamer和youtube dl都支持HDS流。下面是livestreamer的一个示例:
$ livestreamer -O 'hds://radio_chym-lh.akamaihd.net/z/KIT967_1@183249/manifest.f4m' 48k >out.m4a
这是一家互联网广播电台。对于视频,只需要更改
48k
和out.m4a
的文件扩展名。?您编写了一个标题,然后只合并了mdat部分?无法使其工作。首先,没有hex2bin函数,ReadInt32函数无效。我修复了所有这些,但仍然有问题。我认为我的文件是一个64位的mdat片段,因为mdat之前的前4个字符是00 01,这显然不是mdat的大小。正则表达式需要s修饰符:(.{4})mdat[\x08\x09\x12]/isEnclose$fragCount+1
在括号中,以避免对某些包含数字的文件名进行错误处理。我们可以做得比PHP更好。使用对我有用的脚本:PHP AdobeHDS.PHP--fragments Seg1 Frag
(我的f4f文件是:Seg1-Frag1
,Seg2-Frag2
,等等)在FireFox中使用HDS链接检测器插件可以使使用该脚本变得更加容易。我让插件生成正确的命令,将其粘贴到控制台中,然后以这种方式运行它。