问题标签 [fmp4]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ffmpeg - FFmpeg sidx atom 未显示
我需要创建一个带有“sidx”框的 Fragment-MP4 来创建一个可流式和可搜索的视频,以供 MediaSource API 使用它使用“--index”选项使用 Bento4 很容易,但我想这样做使用 ffmpeg,因为它具有良好的其他选项,例如编解码器和比特率以及关键帧,如果我同时使用(ffmpeg,bento4)通过 PHP exec 创建 fmp4,将很难
encryption - HLS。解密 fmp4 段 (AES-128)
我想解密 fmp4 段。此段使用 HLS Apple 工具 ( https://developer.apple.com/documentation/http_live_streaming/about_apple_s_http_live_streaming_tools )加密
方法是 AES-128
IV 是 1d48fc5dee84b5a3e9a428f055e03c2e
我有一个密钥和 IV(您可以在谷歌驱动器中获得密钥和分段https://drive.google.com/drive/folders/1xF-C9EXFvT8qjI--sBB6QMPn8cNW7L-D?usp=sharing)
要解密我使用 Poco 库。
这是我的代码:
问题描述: 解密后我得到了失真的数据。您可以在文件的开头看到这一点。请看下图。右侧的图像文件是扭曲的。您可以在左侧看到正确的数据。
ffmpeg - 用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框
此用例是一项服务,它手动将一系列未压缩的 .wav 媒体片段编码为.m4s片段以通过MPEG-DASH进行广播,使用ffmpeg将 .wav 压缩为 .aac 并使用 sannies/mp4parser将 aac 音频组装成. m4s媒体片段。
我创建了这个公共 GitHub 项目来完整地重现这个问题。
例如,这是自定义的CustomFragmentMp4Builder.java类。
至关重要的是,我们能够使用序列号(索引)指定这个单个 .m4s 片段,我们将为每个媒体片段手动递增该序列号。
目标是构建一个包含盒子类型、和的.m4s片段。作为参考,我使用mp4parser来检查通过.m4s生成的片段。该规范在此处以 .yaml 文件的形式提供SegmentTypeBox
SegmentIndexBox
MovieFragmentBox
ffmpeg -f hls
我的实现创建了一个没有错误的 MP4。但是,当单元测试尝试读取 ChunkMp4Builder 刚刚写入临时文件夹的文件时:
预期的框类型SegmentTypeBox
、SegmentIndexBox
和MovieFragmentBox
do 出现在输出中:
但是,在文件末尾出现了一个未知类型的框:
audio - 每个 mdat 中应包含多少个视频和音频样本?
我正在创建一个带有 2 个轨道的 FMP4(一个用于视频,一个用于音频)。我试图找出我应该在 mdat 中包含多少视频样本以及多少音频。
所以我的 FMP4 具有以下结构:
每个视频 mdat 应该只有 1 帧还是整个 GOP?
如果每个音频 mdat 都有前一个视频 mdat 的相应音频样本,或者我可以发送尽可能多的音频样本(因为音频样本要小得多,我可以发送 2 秒的音频,而之前发送的视频 mdat 只有 1 秒持续时间)。
PS:我想在每个视频 mdat 上发送整个 GOP,但我注意到当我使用 ffmpeg 重新编码 fmp4 时,它使得 mdat 只有 1 帧。我可以做到(每个 mdat 上只有 1 个视频帧),但是我不知道应该发送多少音频样本。如果我只发送该 1 个视频帧的相应音频样本,则音频播放效果不佳。
谢谢!
java - Java mp4parser 输出为空
这个用例是一项服务,它手动将一系列未压缩的 .wav 媒体片段编码为 .m4s 片段,以便通过 MPEG-DASH 进行广播,使用 ffmpeg 将 .wav 压缩为 .aac 并使用 sannies/mp4parser 将 aac 音频组装成 . m4s 媒体片段。
我创建了这个公共 GitHub 项目来完整地重现这个问题。
例如,这是自定义ChunkFragmentM4sBuilder.java类。
使用 MP4 盒的第一个示例有效,因为我能够生成初始化 MP4 + 系列片段 M4s 文件,然后可以将它们连接起来形成可播放的 MPEG4 流。
注意:此用例要求每个媒体段都从单独生成的源段编码,而不是使用 MP4Box 等工具从连续音频源流式传输。
通过 mp4parser 手动构建媒体片段的尝试总体上仍然失败,因为下面使用的ChunkFragmentM4sBuilder.java编写的片段格式不正确。但我很难理解它们究竟是如何畸形的。
并排比较两个测试日志ChunkFragmentM4sBuilderTest.log.txt 和MP4BoxTest.log.txt对我很有帮助。
通过 Java mp4parser(格式错误)
前一个日志来自ChunkFragmentM4sBuilderTest.java导致串联的测试输出test-java-mp4parser.mp4实际上是空的:
连接框:
通过 MP4Box(好的)
后一个日志来自MP4BoxTest.java,这导致连接的测试输出 test-mp4box.mp4可以。
但是请注意,此方法对于最终用例是不可接受的,因为此 hack 方法输出的块中存在缺陷。
连接框:
java - Java mp4parser 片段序列不连续
这个用例是一项服务,它手动将一系列未压缩的 .wav 媒体片段编码为 .m4s 片段,以便通过 MPEG-DASH 进行广播,使用 ffmpeg 将 .wav 压缩为 .aac 并使用 sannies/mp4parser 将 aac 音频组装成 . m4s 媒体片段。
我创建了这个公共 GitHub 项目来完整地重现这个问题。
例如,这是自定义ChunkFragmentM4sBuilder.java类。
此日志来自ChunkFragmentM4sBuilderTest.java导致串联的测试输出test-java-mp4parser.mp4似乎没问题:
但是,当我使用 VLC 播放随附的播放列表和片段时,我在日志中看到了这些故障:
当 VLC 播放以下 DASH 播放列表时会发生此错误:
这是我的自定义片段构建器类的最新实现和附加说明:
java - 使用单独制作的 fmp4 片段跳过纯音频 HLS
这是我的 HLS 播放列表:
我可以使用VLC流式传输该链接。但是,我在每个 10 秒的片段之间听到一个微小的音频错误,例如“跳过”。
这是我的初始化部分:
以下是通过编码 AAC 音频生成的分段 mp4 片段ffmpeg
,然后使用java mp4parser 仅将媒体片段写入 .m4s:
- 矮胖128k-163840683.m4s
- 矮胖128k-163840684.m4s
- 矮胖128k-163840685.m4s
- 矮胖128k-163840686.m4s
- 矮胖128k-163840687.m4s
- 矮胖128k-163840688.m4s
以下是关于我为创建这些而开发的过程的详细实验室笔记:https ://github.com/charneykaye/encode-fmp4-demo
这是输出ffprobe chunky.m3u8
:
悖论?
我正在阅读https://video.stackexchange.com/questions/34627/audio-discontinuities-when-generating-hls-segments-in-different-processes “基于 MDCT 的编解码器(如 AAC 或 MP3)在多个相邻帧”并想知道答案是否是,这对于 AAC 或 MP3 音频是不可能的,事实上,因为单独生成媒体片段是一个约束,我需要生成 MPEG-2 TS 片段?或者那也无济于事?
video - Play fmp4 using mse player,set video.currentTime to sourceBuffer.buffered.end(0),but the play frame always delay 2 frames duration
I ran websock to receive fmp4 video stream(no audio data),and append segment to sourceBuffer,the video(25fps) is pull from rtsp media server,and be converted to fragment mp4 via ffmpeg api. When mse player raise 'play' event,i set video currentTime to the latest buffer timestamp via sourceBuffer.buffered.Such as the current sourceBuffer.buffered.end(0) is equal 100.0,and i set video currentTime to 100.0,it can run normally,but while i debug on setinterval per second, it show it about these "current time = 2224.166326, sourceBuffer.buffered.end = 2224.24","current time = 2269.164432, sourceBuffer.buffered.end = 2269.24".the currentTime is always slow about 80ms(2 frames duration),and the picture show on player is also slow about 80ms. I want play the video as fast as sourceBuffer.buffered.end. Anyone help? Thanks;
video - FFMPEG .m3u8 文件无法在浏览器中播放
第一个问题,请善待。
我的目标是下载一个 .mp4 文件,切掉音频,进行分段,然后将 .mp4 拆分为分段。预期的结果是有一个 init.mp4 一个 .m3u8 文件以及多个可在浏览器中播放的 .m4s 段。
到目前为止我做了什么。使用以下命令下载视频文件并切断音频流:
在此之后,我通过这样做来分割结果:
然后我尝试拆分碎片 frag.mp4 以创建 init.mp4 + .m3u8 + .m4s,如下所示:
为了查看它是否有效,我创建了一个 HTML 文件并插入了 .m3u8 文件作为视频标签的来源。
HTML:
在此之后,我用 python3 启动了一个本地服务器,看看我是否做对了,但显然浏览器(谷歌浏览器)无法加载文件并显示错误:
无法加载媒体,原因可能是服务器或网络出现故障,或者格式不受支持。 Chrome 控制台报告
我尝试了相同的过程,但没有切断音频的第一部分并且它起作用了,所以我肯定做错了什么。