Can jcodec add audio to MP4 file?
对于有使用jcodec经验的任何人,我的理解是该库尚无法编码音频(但是可以对其进行解码)。
但是,jcodec确实具有PCMMP4MuxerTrack类,该类允许您在编码MP4视频时将原始PCM数据的SampleSamples(ByteBuffer)添加到音轨。这样会产生带有声音的MP4视频文件。
我已经成功地将一些虚拟PCM音频添加到了我导出的MP4文件中,并且VLC正常播放了它,所以它似乎可以正常工作...
但是,如果这行得通,为什么我总是看到人们说MP4不支持PCM音频(一个来源)?
我是否很幸运VLC可以准确地播放带声音的MP4文件?它可能无法在其他播放器/操作系统上运行吗?
- why do I keep seeing people say that MP4 doesnt support PCM audio?很好,因为它没有。 MPEG提供的MP4仅包含MPEG编解码器(h.264 / h.265视频和AAC / MP3音频)。在VLC中,依次转到"工具"和"编解码器信息"。流0通常是视频,流1是音频。音频会说MP4a吗? (然后JCodec已将PCM转换为AAC或MP3),否则,这意味着您很幸运VLC播放了它。通过将文件也拖到浏览器选项卡中进行测试(由于浏览器了解AAC和PCM,因此可能会起作用)。如果浏览器也可以播放它就足够了吗?
-
啊,那实际上很有帮助,我不知道VLC技巧。确实是PCM,这是个好消息,因为我想知道jcodec是否在幕后转换为AAC / MP3?
-
不幸的是Java不是我的主要语言,但我了解媒体格式。我不知道JCodec如何在同一位置写入PCM但不能写入AAC / MP3字节?如果您在这里查看,那么我认为MP4Muxer.java或FramesMP4MuxerTrack.java都会帮助您添加音频帧。 MP3和AAC音频本身被分成帧,所以也许做一个for loop来获取每个AAC帧字节和多路复用器?
-
假设您有一个要用作音频的aac文件...在某个十六进制编辑器中将其打开以确认您在此处阅读了什么。无论如何,将帧长(整数)添加到变量中。现在返回到帧起始字?谖恢貌⑻?个字节,然后根?lt;frame_length - <抓取所有内容。您已经准备好一个aac帧进行复用..从新位置开始以字节为单位重复,依此类推,直到文件结束。
-
@FTLRalph我尝试了您的方法,但是在播放视频时却听到了奇怪的声音
我希望这能奏效,您告诉我。.在Java中打开一个AAC文件以读取其字节
1)准备变量
1 2
| int frameLength;
byte[] header = new byte[7]; //a byte array of 7 slots |
2)现在将AAC文件流的前7个字节复制到此"标头"数组中。
1 2 3
| 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帧,您可以尝试使用具有功能addFrame(MP4Packet pkt)的FramesMP4MuxerTrack.java,其中MP4Packet pkt是您复制的AAC帧字节。每次找到新的AAC框架时,就调用该函数。
- 非常感谢您抽出宝贵的时间将所有内容整理在一起,这对我来说似乎很有效,并且给了我一些工作要做的事情,好奇地想知道这种方法是否行得通。再次感谢。
-
@Para我想我走了让jcodec制作MP4视频文件的方式,然后拿走了我的AAC文件和MP4文件,并与mp4parser混合在一起-工作非常简单github.com/sannies/mp4parser/blob/master/examples/src / main / j ava /