【问题标题】:Can jcodec add audio to MP4 file?jcodec 可以将音频添加到 MP4 文件吗?
【发布时间】:2015-08-11 22:24:58
【问题描述】:

对于使用过jcodec 的任何人,我的理解是该库还不能对音频进行编码(但是它可以对其进行解码)。

但是,jcodec 确实有一个PCMMP4MuxerTrack class,它允许您在编码 MP4 视频时将原始 PCM 数据addSamples(ByteBuffer) 添加到音轨。这会生成一个带声音的 MP4 视频文件。

我已经成功地将一些虚拟 PCM 音频添加到我导出的 MP4 文件中,并且 VLC 可以正常播放它,所以它似乎可以工作......


但如果这可行,为什么我总是看到人们说 MP4 不支持 PCM 音频 (one source)?

我是不是很幸运 VLC 可以准确地播放我的 MP4 文件和声音?它可能不适用于其他播放器/操作系统吗?

【问题讨论】:

  • why do I keep seeing people say that MP4 doesn't support PCM audio? 好吧,因为它没有。 MP4 由 MPEG 组成,仅包含 MPEG 编解码器(h.264/h.265 视频和 AAC/MP3 音频)。在 VLC 中转到 Tools,然后转到 Codec Information。流 0 通常是视频,流 1 是音频。音频说 MP4a 吗? (然后 JCodec 已将 PCM 转换为 AAC 或 MP3)否则这意味着您很幸运 VLC 播放了它。通过将文件拖到浏览器选项卡中进行测试(它可能会工作,因为浏览器同时理解 AAC 和 PCM)。如果浏览器也能玩就够了吗?
  • 啊,这实际上很有帮助,我不知道 VLC 技巧。确实是 PCM,很高兴知道,因为我想知道 jcodec 是否在幕后转换为 AAC/MP3 - 猜不到。
  • 不幸的是,Java 不是我的主要语言,但我了解媒体格式。我不明白 JCodec 如何在同一个地方写入 PCM 而不是 AAC/MP3 字节?如果您 look here 那么我认为 MP4Muxer.javaFramesMP4MuxerTrack.java 将帮助您添加音频帧。 MP3 和 AAC 音频本身被分成帧,所以也许做一个for loop 来获取每个 AAC 帧字节和多路复用器??
  • 假设您有一个想要用作音频的 aac 文件...在一些 hex 编辑器中打开它以确认您的内容 read here .无论如何,将帧长度(整数)设置为变量。现在回到帧起始字​​节位置并跳过 7 个字节,然后根据frame_length - 7 抓取所有内容您有一个准备好复用的 aac 帧.. 从新位置重复以字节为单位,依此类推,直到文件结束。
  • @FTLRalph 我尝试了您的方法,但播放视频时声音很奇怪

标签: java audio mp4 pcm jcodec


【解决方案1】:

我希望这行得通,你告诉我.. 在 java 中打开一个 AAC 文件以读取它的字节

1) 准备变量

int frameLength;
byte[] header = new byte[7]; //a byte array of 7 slots

2) 现在将 AAC 文件流的前 7 个字节复制到这个“头”数组中

frameLength = (header[3]&0x03) << 11 | 
              (header[4]&0xFF) << 3 | 
              (header[5]&0xFF) >> 5 ;

3) 从 AAC 中的第 8 个字节开始,您可以复制所有字节,直到 FrameLength 减 7。我们减 7,因为提取的 FrameLength 包括 AAC 标头(称为 ADTS 标头)的 7 个字节,并且在 MP4 中您有声音减去 ADTS 标头,因此每个帧副本必须跳过这 7 个字节。

提示:每个帧的头的前 5 个字节保持不变,因此您可以在整个文件中搜索该字节模式以识别每个 AAC 帧的位置,如果您知道之前的帧的起始位置,那么你也可以计算出长度。

现在您有一个 AAC 帧,您可以尝试使用 FramesMP4MuxerTrack.java,它有一个函数 addFrame(MP4Packet pkt),其中MP4Packet pkt 将是您复制的 AAC 帧字节。每次找到新的 AAC 帧时调用该函数。

【讨论】:

  • 非常感谢您抽出宝贵的时间将所有这些放在一起,这对我来说似乎很有效,并且给了我一些可以解决的问题,很想知道这种方法是否可行。再次感谢。
  • @Para 我想我采取了让 jcodec 制作 MP4 视频文件的方式,然后将我的 AAC 文件和 MP4 文件与 mp4parser 混合在一起 - 工作非常简单github.com/sannies/mp4parser/blob/master/examples/src/main/java/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多