gpt4 book ai didi

iphone - 加入多个 ALAC 文件。

转载 作者:行者123 更新时间:2023-11-29 13:30:16 24 4
gpt4 key购买 nike

我能够加入多个内部带有编码 PCM 音频的 CAF 文件。首先,我从一个 CAF 文件中读取数据格式。

UInt32 size = sizeof(srcFormatDescription);
status = AudioFileGetProperty(srcAudioFile, kAudioFilePropertyDataFormat, &size, &srcFormatDescription);

PCM 数据格式如下所示

[Line 7697] mSampleRate: 44100.000000
[Line 7698] mFormatID: 1819304813d
[Line 7699] mFormatFlags: 12d
[Line 7700] mBytesPerPacket: 2d
[Line 7701] mFramesPerPacket: 1d
[Line 7702] mBytesPerFrame: 2d
[Line 7703] mChannelsPerFrame: 1d
[Line 7704] mBitsPerChannel: 16d
[Line 7705] mReserved: 0d

然后我为目标文件设置数据格式,它将包含所有 CAF。

destFormatDescription = srcFormatDescription;
status = AudioFileCreateWithURL(dest, kAudioFileCAFType, &destFormatDescription, kAudioFileFlags_EraseFile, &destAudioFile);

下一步我从 CAF 读取数据

status = AudioFileReadBytes(srcAudioFile,
FALSE,
currentStartForReading,
&bytesNumberToRead,
buffer);

并将其写入到 destAudioFile

status = AudioFileWriteBytes(destAudioFile,
FALSE,
writePosition,
&bytesNumberToWrite,
buffer);

这些步骤是循环完成的。它很好用。但是我有一个大问题,现在我尝试对包含 ALAC 格式数据的 CAF 文件执行相同的步骤。它不起作用。不支持 AudioFileWriteBytes 返回错误操作。

ALAC 数据格式如下所示

[Line 7697] mSampleRate: 44100.000000
[Line 7698] mFormatID: 1634492771d
[Line 7699] mFormatFlags: 1d
[Line 7700] mBytesPerPacket: 0d
[Line 7701] mFramesPerPacket: 4096d
[Line 7702] mBytesPerFrame: 0d
[Line 7703] mChannelsPerFrame: 1d
[Line 7704] mBitsPerChannel: 0d
[Line 7705] mReserved: 0d

有人知道如何将多个 CAF 文件与里面的 Apple Lossless 数据连接起来吗?

最佳答案

I am able to join multiple CAF files with encoded PCM audio inside. First I read data format from one of CAF files.

如果 ASBD 匹配,那么您的音频文件就是正确的。但是,如果输入文件的样本格式不匹配,那么您的数据就会损坏。这是因为每个 CAF 文件只定义了一个样本数据 block 和一个音频描述 block 。

因此,尝试将多种格式的样本数据附加到一个音频数据 block 中是错误的。 (未指定是否是您正在尝试的)

此外,压缩格式还有一个必须设置的附加字段 - 即 magic cookie。所有 cookie 都必须相等(顺便说一句,这是一种不透明的数据表示)。

最后,写入压缩数据的正确方法是使用数据包表 block 。 VBR/VFR 格式必须准确指定一个数据包表 block 。

Does anybody know how can I join multiple CAF files with Apple Lossless data inside?

这一切意味着什么:使用您在 ALAC 案例中选择的方法将会有很高的失败率。同样,要使这些文件及其 block 与所涉及的所有数据包详细信息正确同步,需要做很多工作。

那么,让我们从另一个角度来看这个问题:

  • 使用 ExtAudioFileCreateWithURL 创建一个新的 ALAC 文件
  • 使用 ExtAudioFileOpenURL 打开您的输入文件
  • 从您的输入文件中确定一个通用的示例格式
  • 使用ExtAudioFileSetProperty + kExtAudioFileProperty_ClientDataFormat指定常用的PCM格式
  • 配置目标/ALAC 文件的转换器以期待您选择的通用 PCM 格式。
  • 读取输入文件的样本数据,写入目标
  • 对剩余的文件重复
  • 关闭所有文件

应该就是这样(但如果您要处理原始 AudioFile API,它可能需要几百行代码)。

关于iphone - 加入多个 ALAC 文件。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com