是否有可能从单个stream式字节范围块创build新的mp4文件?

如果我在支持字节范围的服务器上有远程mp4文件,是否可以检索单个字节范围并从该范围数据创build新的/自包含的mp4?

如果我尝试使用fs.createWriteStream(remoteFilename)将返回的字节范围数据直接写入mp4文件,则不会获取需要播放的video元数据(持续时间,维度等)。

当我得到一个字节范围,从0开始,以XX结束时,输出mp4是可播放的,但是会有整个video长度的持续时间元数据,并且当字节范围在剩余时间内完成时将冻结屏幕时间。

还有什么我可以采取一个字节范围,并从该stream对象创build一个独立的.mp4文件?

整个过程就是避免下载整个10分钟的文件,然后才能使用ffmpeg制作5秒的剪辑。 如果我可以计算和下载字节范围,应该有办法将它写入独立的MP4文件。

预先感谢您提供的任何帮助。

MP4文件是用框来构造的。 其中两个主要是moov和mdat(非零碎MP4的一般情况):

  • moov框:包含其他框:) – 它们中的每一个都包含有关在mdat框中存在的编码数据(moov =关于MP4文件的元数据)的信息。 典型的元数据是持续时间,帧率,编解码器信息,对video/audio帧的参考…
  • mdat box:包含文件的实际编码数据。 它可以来自各种编解码器,包括audio和video数据(或者只有其中之一)。 对于H264,在mdat框中包含NAL单元。

moov框是(应该)在MP4文件networking传递的文件的开始,所以如果你写一个字节范围请求从0到XX,你可能会得到整个moov框+一定数量的mdat数据。 因此文件可以播放到某个点。 如果你从YY到XX的字节范围,你将不会得到一个像样的moov盒,但很多mdat,因为它们不能被使用,除非它们被重新包装在一个合适的moov盒的MP4文件中,引用关于“cut”mdat的信息。

可以从字节范围区块重新创build一个有效的MP4文件,但它需要高级的MP4文件格式结构知识(您还需要检索moov盒以使其可以熬过)。 MP4文件格式是基于ISO基本媒体文件格式 – 被指定为ISO / IEC 14496-12(MPEG-4第12部分)。

我知道2个库可以帮助你做你想做的事情:一个在PHP中 ,一个在Java中 。 我不知道这个lib是否存在node.js(我想它可以被移植)。 即使你不使用它们,上面的两个库也包含有关这个主题的有价值的信息。

为了给你的问题提供一个答案,你可以用不同的angular度来解决这个问题。 知道你想要的文件的哪一部分,你可以执行一个ffmpeg命令拼接全长的MP4文件服务器端到一个较小的,然后做你需要这个新的小MP4文件(因为你不需要在客户端上下载不必要的数据)。

ffmpeg命令是(在这种情况下从文件开始1分钟):

 ffmpeg -i input.mp4 -ss 00:00:00.000 -t 00:01:00.000 -c:a copy -c:v copy output.mp4 

有关上述命令行的更多信息,请参阅此文章

由于MP4文件结构只是重新组织而没有重新转码,因此这个过程非常快。

编辑: 或者我可以在远程文件上使用ffmpeg并在本地创build新的剪辑?

 ffmpeg -ss 00:01:00.000 -i "http://myfile.mp4" -t 00:02:00.000 -c:a copy -c:v copy output.mp4 

假设你在你的客户端(app / web)上有ffmpeg,如果你运行上面的命令,ffmpeg会把mp4提取到input的URL,然后寻求1分钟,然后从那里削减2分钟,所以把生成的内容写到output.mp4 本地当然没有下载完整的文件)。

ffmpeg需要支持http协议input (你可以在大多数的二进制文件中find)。 你可以在这里阅读关于在哪里放置-ss参数(优点/缺点)的更多信息。