我在获取压缩(mp3)声音并将其保存为 PCM 方面取得了一些进展。此外,我想在同一进程中将原始文件拆分为 2 秒长的块。我似乎成功了,但我有点困惑为什么。
当我读取音频块并将文件写出时,我检查我是否要写一个会使我的文件超过我的 2 秒限制的块。如果是这样,我写的足够多到 2 秒,关闭文件,然后打开一个新文件并将剩余部分写入新文件,然后读取更多数据。像这样的东西:
framesInTimedSegment += numFrames;
if ((framesInTimedSegment > (2.0 * sampleRate)) && (j < 5)) {
UInt32 newNumFrames = numFrames;
numFrames = framesInTimedSegment - (2.0 * sampleRate);
newNumFrames -= numFrames;
// Question A
UInt32 segmentOffset = newNumFrames * numChannels * 2;
error = ExtAudioFileWrite(segmentFile, newNumFrames, &fillBufList);
// Question B
// handle this error! We might have an interruption
if (segmentFile) ExtAudioFileDispose(segmentFile);
XThrowIfError(ExtAudioFileCreateWithURL(urlArray[++j], kAudioFileCAFType, &dstFormat, NULL, kAudioFileFlags_EraseFile, &breakoutFile), "ExtAudioFileCreateWithURL failed! - segmentFile");
size = sizeof(clientFormat);
XThrowIfError(ExtAudioFileSetProperty(segmentFile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat), "couldn't set destination client format");
fillBufList.mBuffers[0].mData = srcBuffer + segmentOffset;
fillBufList.mBuffers[0].mDataByteSize = numFrames * fillBufList.mBuffers[0].mNumberChannels * 2;
framesInTimedSegment = numFrames;
}
error = ExtAudioFileWrite(segmentFile, numFrames, &fillBufList);
这是我的问题(我试图标记相关行):
A:有没有更好的方法来找到缓冲区的偏移量,这样我就不会错误地在其中硬编码一些值?例如,有没有一种幸运的方法可以从帧号中获取数据偏移量?
B:如果 ExtAudioFileWrite 正在做从压缩到解压缩的转换,那么我正在写入的数据还没有被解压缩(对吗?),所以我在处理时不必担心播放帧数和偏移量压缩数据?我是否应该先将文件转换为 PCM 文件或内存,然后拆分该 PCM?
谢谢!
-马布德
附言。
clientFormat 定义如下:
clientFormat = dstFormat;
和 dst 格式:
dstFormat.mFormatID = outputFormat;
dstFormat.mChannelsPerFrame = srcFormat.NumberChannels();
dstFormat.mBitsPerChannel = 16;
dstFormat.mBytesPerPacket = dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame;
dstFormat.mFramesPerPacket = 1;
dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger; // little-endian