[英]Java mp4parser to create a single .m4s fragment
此用例是一項服務,它手動將一系列未壓縮的 .wav 媒體片段編碼為.m4s片段以通過MPEG-DASH進行廣播,使用ffmpeg將 .wav 壓縮為 .aac 並使用sannies/mp4parser將 aac 音頻組裝成.m4s片段。 m4s媒體片段。
我創建了這個公共 GitHub 項目來完整重現這個問題。
例如,這里是自定義CustomFragmentMp4Builder.java類。
我們能夠使用序列號(索引)指定這個單個 .m4s 片段至關重要,我們將為每個媒體段手動增加該序列號。
目標是構建一個包含框類型SegmentTypeBox
、 SegmentIndexBox
和MovieFragmentBox
的.m4s片段。 作為參考,我使用mp4parser檢查了通過ffmpeg -f hls
生成的.m4s片段。 此規范可在此處作為 .yaml 文件使用
我的實現創建了一個沒有錯誤的 MP4。 但是,當單元測試嘗試讀取 ChunkMp4Builder 剛剛寫入臨時文件夾的文件時:
java.lang.RuntimeException: A cast to int has gone wrong. Please contact the mp4parser discussion group (3724673092)
at org.mp4parser.tools.CastUtils.l2i(CastUtils.java:30)
at org.mp4parser.support.AbstractBox.parse(AbstractBox.java:97)
at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:116)
at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107)
at org.mp4parser.IsoFile.<init>(IsoFile.java:57)
at org.mp4parser.IsoFile.<init>(IsoFile.java:52)
at com.charneykaye.TestBase.getMp4Boxes(TestBase.java:116)
at com.charneykaye.CustomFragmentMp4BuilderTest.run(CustomFragmentMp4BuilderTest.java:78)
預期的框類型SegmentTypeBox
、 SegmentIndexBox
和MovieFragmentBox
確實出現在輸出中:
但是,在文件末尾會出現一個未知類型的框:
由於mdat
原子大小不正確,您的m4s
段無效。
例如在test5-128k-151304042.m4s
, mdat
被標記為長度為 16 字節,但末尾有數據,文件大小為 164884。
然后解析器嘗試讀取無效的偏移量。 avc5
不是原子而是字符串“Lavc58.54.100”的一部分。 讀取為 3724673100 的長度也是無效的並且大於 32 位整數的最大值,因此無效轉換為 int。
在您的實施中,您有:
ParsableBox moov = createMovieFragmentBox(movie);
isoFile.addBox(moov);
List<SampleSizeBox> stszs = Path.getPaths(moov, "trak/mdia/minf/stbl/stsz");
// ...
protected MovieFragmentBox createMovieFragmentBox(Movie movie) {
MovieFragmentBox mfb = new MovieFragmentBox();
// ...
}
這不是moov
原子,而是moof
。 那里沒有stsz
,樣本大小的總和為 0,因此mdat
的總計算大小為 16 + 0。
moov
應該在初始化段中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.