JAAD 0.8.4解码FFmpeg转换的M4A时出现“movie box at end of file”异常求助
解决JAAD读取FFmpeg转换的M4A文件时的
movie box at end of file异常 问题原因
FFmpeg默认转换生成的M4A是碎片化(fragmented)MP4格式,这类文件的核心元数据盒子moov位于文件末尾;而iTunes从CD导入的M4A是常规MP4,moov盒子在文件开头。JAAD 0.8.4版本依赖随机访问读取moov元数据,而AudioSystem.getAudioInputStream()返回的是顺序读取流,无法定位到文件末尾的moov盒子,因此抛出异常。
解决方案
方案1:修改FFmpeg转换命令,生成moov前置的M4A
在转换命令中添加-movflags faststart参数,FFmpeg会自动将moov盒子移至文件开头,让JAAD可以通过顺序流正常读取:
ffmpeg -i input.mp3 -vn -c:a aac -b:a 192k -movflags faststart output.m4a
方案2:在Java代码中直接使用JAAD的随机访问API
绕过AudioSystem的包装,直接用JAAD提供的支持随机访问的类读取文件:
import net.sourceforge.jaad.mp4.MP4File; import net.sourceforge.jaad.mp4.MP4Track; import net.sourceforge.jaad.audio.AudioInputStream; import javax.sound.sampled.AudioFormat; import java.io.RandomAccessFile; import java.io.File; // 示例代码 File songFile = new File("your-m4a-file.m4a"); RandomAccessFile raf = new RandomAccessFile(songFile, "r"); MP4File mp4File = new MP4File(raf); // 获取音频轨道 MP4Track audioTrack = mp4File.getAudioTrack(); if (audioTrack == null) { throw new IllegalArgumentException("文件中无音频轨道"); } // 构建PCM音频格式 AudioFormat audioFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, audioTrack.getSampleRate(), 16, // JAAD默认输出16位PCM audioTrack.getChannelCount(), audioTrack.getChannelCount() * 2, // 帧大小:通道数*2(16位) audioTrack.getSampleRate(), false // 小端字节序 ); // 创建JAAD的AudioInputStream并转换为标准Java音频流 AudioInputStream jaadAis = new net.sourceforge.jaad.audio.AudioInputStream(audioTrack); javax.sound.sampled.AudioInputStream finalAis = new javax.sound.sampled.AudioInputStream( jaadAis, audioFormat, audioTrack.getSampleCount() ); // 后续使用finalAis进行播放等操作
方案3:升级JAAD版本
JAAD的后续版本(如0.9.x及以上)对碎片化MP4的支持有所改进,尝试升级至最新稳定版,可能无需修改命令或代码即可兼容。
内容的提问来源于stack exchange,提问作者B. Stackhouse
相关产品推荐
相关产品推荐

