- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如果我在支持字节范围的服务器上有一个远程 mp4 文件,是否可以检索单个字节范围并从该范围数据创建一个新的/自包含的 mp4?
如果我尝试使用 fs.createWriteStream(remoteFilename)
将返回的字节范围数据直接写入 mp4 文件,它不会获得它所包含的视频元数据(持续时间、尺寸等)需要可玩。
当我得到一个以 0 开头并以 XX 结尾的字节范围时,输出 mp4 可以播放,但将具有整个视频长度的持续时间元数据,并在字节范围完成剩余部分时卡住屏幕的持续时间。
我还能如何获取字节范围并从该流对象创建独立的 .mp4 文件?
这样做的目的是为了避免在我使用 ffmpeg 制作 5 秒的剪辑之前下载整个 10 分钟的文件。如果我可以计算并下载字节范围,应该有办法将其写入独立的 mp4 文件。
在此先感谢您提供的任何帮助。
最佳答案
MP4 文件由框构成。其中两个主要是 moov 和 mdat(非碎片化 MP4 的一般情况):
对于 MP4 文件 Web 传输,moov 框(应该是)在文件的开头,因此如果您写入从 0 到 XX 的字节范围请求,您可能会得到整个 moov 框 + 一定数量的 mdat 数据。因此文件可以播放到某个点。如果你的字节范围从 YY 到 XX,你可能不会得到一个像样的 moov 框,但是很多 mdat 不能使用,除非它们被重新打包到一个 MP4 文件中,并有一个合适的 moov 框引用关于“剪切”mdat 的信息.
可以从字节范围 block 重新创建有效的 MP4 文件,但这需要 MP4 文件格式结构的高级知识(您还需要检索 moov 框以使其可以忍受)。 MP4 文件格式基于 ISO base media file format - 被指定为 ISO/IEC 14496-12(MPEG-4 第 12 部分)。
我知道 2 个库可以帮助你做你想做的事:一个在 PHP 中和一个 Java .我不知道 node.js 是否存在这样的库(我想它可以被移植)。即使您不使用它们,上面的 2 个库也包含有关该主题的有值(value)的信息。
要回答您的问题,您可以换个角度解决问题。在几毫秒内知道你想要文件的哪一部分,你可以执行一个 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
有关 above command line 的更多信息,请参阅此帖子
这完成得非常快,因为 MP4 文件结构只是重新组织,没有重新转码。
编辑: 或者我可以在远程文件上使用 ffmpeg 并在本地创建新剪辑吗?
ffmpeg -ss 00:01:00.000 -i "http://myfile.mp4" -t 00:02:00.000 -c:a copy -c:v copy output.mp4
假设您的客户端(应用程序/网络)上有 ffmpeg,如果您运行上述命令,ffmpeg 会将 mp4 提取到输入 URL,然后寻找 1 分钟并从那里剪切 2 分钟,然后将生成的内容写入输出。 mp4 本地(当然无需下载完整文件)。
ffmpeg 需要构建为支持 http protocol input (你会在大多数二进制文件中找到)。你可以阅读here有关在何处放置 -ss 参数(优点/缺点)的更多信息。
关于node.js - 是否可以从单个流字节范围 block 创建新的 mp4 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23161854/
我正在使用以下代码播放声音,过一会儿它将停止播放声音,这是因为我相信有太多的Mediaplayer打开实例,所以我添加了一个额外的mp.release();,这只会使我的应用程序崩溃(目前已被注释掉)
我正在查看 XV-6 代码,它通过它识别 MP 结构。它首先在 EBDA 的第一个 kb 中搜索。代码是这样的 static struct mp* mpsearch(void) { uchar *
我在我的应用程序中使用 Mp 饼图。它显示非常小的尺寸,我试图增加它的尺寸但它没有增加它的尺寸。我无法找出问题所在。请告诉我们如何增加尺寸。 这是我的代码: public class MPpiecha
如何使用 MPAndroidChart 实现此目的? 使用版本:com.github.PhilJay:MPAndroidChart:v3.1.0-alpha 添加图例和饼图边距的代码: private
亲爱的社区,我面临以下问题,我正在使用此处提供的 MP android 图表库创建条形图:https://github.com/PhilJay/MPAndroidChart . 我想为我的条设置渐变背
我正在使用 SAS MP Connect 开发我的第一段代码,以运行同一个 sas 作业的并行线程。 我知道 MP CONNECT 仅受可用 CPU 数量的物理限制,但理想情况下我不想在我的工作中使用
我最近购买了在 Linux 服务器上运行的 Stata MP12(8 核)许可证。 有没有人写过 Stata 程序,比如说模拟研究来测试 Stata MP 的性能?我想监视在作业处理过程中实际使用的内
我将不胜感激任何“一步一步”指南,说明如何更改 PHP/HTML 页面上的动态数据库连接/连接字符串/等上的代码,使其“即插即用”工作通过 ftp 将页面和 MySQL 数据库托管在“Azure 网站
试图在我的应用程序中放置一个“暂停”按钮,以播放一些声音片段循环播放。 当我打电话mp.pause();一切都破了,我完全迷路了! 这是我正在使用的方法。 protected void man
我想使用 Mp Chart 创建折线图 我想要实现的是这张图片 但是到目前为止我已经得到了这个。 我使用的代码是这个 private fun setData() { val entries
通常,我可能会编写一个类似simd的循环: float * x = (float *) malloc(10 * sizeof(float)); float * y = (float *) malloc
在与堆栈空间、OpenMP 以及如何处理这些问题相关的其他帖子上,有很多回复。但是,我找不到信息来真正理解 OpenMP 调整编译器选项的原因: 原因是什么-fopenmp在 gfortran 中暗示
我有一段代码,可以根据漂移、波动性和随机数计算任意给定日期的股票价格。但是当我检查输出列表时 - 它们是算术级数,而不是几何级数(幂函数)。我共享的变量有问题吗? 代码如下: #include #i
我正在尝试在 C++11 中并行化动态编程算法使用这种方法: void buildBaseCases() { cout << "Building base cases" << endl
我正在 open MP 中实现并行点积 我有这个代码: #include #include #include #include #include #include #define SIZE
我有一台服务器已经将近 4 年了,直到现在我都没有遇到任何问题(主机端)。我一直在更换主机,因为 ddos 的东西试图找到最适合我的东西。现在我买了一个 VPS(这不是我的第一个)并尝试运行我的服
所以我有两个内部平行区域的外部平行区域。是否可以将 2 个线程放入外部平行线,将 4 个线程放入每个内部平行线?我做了这样的东西,但它似乎无法按照我想要的方式工作。有什么建议吗? start_r =
我希望有人指出我们遇到的问题或解决方法。 使用/MP 编译项目时,似乎只有同一文件夹中的文件会同时编译。我使用 Process Explorer 滑动命令行并确认行为。 项目过滤器似乎对并发编译的内容
本文整理了Java中me.chanjar.weixin.mp.api.WxMpMessageRouter类的一些代码示例,展示了WxMpMessageRouter类的具体用法。这些代码示例主要来源于G
我正在监视 Stata/MP(Stata/SE 的多核版本)的 CPU 和内存使用情况,但我不是 Stata 程序员(更像是 Perl 人)。 任何人都可以发布一些代码,利用公共(public)数据集
我是一名优秀的程序员,十分优秀!