gpt4 book ai didi

iPhone 扩展音频文件服务,mp3 -> PCM -> mp3

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:23 28 4
gpt4 key购买 nike

我想使用 Core Audio 扩展音频文件服务框架来读取 mp3 文件,将其处理为 PCM,然后将修改后的文件写回 mp3 文件。我能够将 mp3 文件转换为 PCM,但无法将 PCM 文件写回 mp3。

我已经关注并分析了 Apple ExtAudioFileConvertTest 示例,但也无法使其正常工作。失败点是当我为输出文件设置客户端格式时(设置为规范的 PCM 类型)。这失败并出现错误“fmt?”如果输出目标类型设置为 mp3。

是否可以在 iPhone 上播放 mp3 -> PCM -> mp3?如果我删除失败的行,为输出文件设置 kExtAudioFileProperty_ClientDataFormat,代码将失败并显示“pkd?”当我稍后尝试写入输出文件时。所以基本上我有 2 个错误:

1)“嗯?”尝试为输出文件设置 kExtAudioFileProperty_ClientDataFormat 时

2)“pkd?”尝试写入输出文件时

这是设置文件的代码:

NSURL *fileUrl = [NSURL fileURLWithPath:sourceFilePath];
OSStatus error = noErr;

//
// Open the file
//
error = ExtAudioFileOpenURL((CFURLRef)fileUrl, &sourceFile);

if(error){
NSLog(@"AudioClip: Error opening file at %@. Error code %d", sourceFilePath, error);
return NO;
}

//
// Store the number of frames in the file
//
SInt64 numberOfFrames = 0;
UInt32 propSize = sizeof(SInt64);
error = ExtAudioFileGetProperty(sourceFile, kExtAudioFileProperty_FileLengthFrames, &propSize, &numberOfFrames);

if(error){
NSLog(@"AudioClip: Error retreiving number of frames: %d", error);
[self closeAudioFile];
return NO;
}

frameCount = numberOfFrames;

//
// Get the source file format info
//
propSize = sizeof(sourceFileFormat);
memset(&sourceFileFormat, 0, sizeof(AudioStreamBasicDescription));

error = ExtAudioFileGetProperty(sourceFile, kExtAudioFileProperty_FileDataFormat, &propSize, &sourceFileFormat);

if(error){
NSLog(@"AudioClip: Error getting source audio file properties: %d", error);
[self closeAudioFile];
return NO;
}

//
// Set the format for our read. We read in PCM, clip, then write out mp3
//
memset(&readFileFormat, 0, sizeof(AudioStreamBasicDescription));

readFileFormat.mFormatID = kAudioFormatLinearPCM;
readFileFormat.mSampleRate = 44100;
readFileFormat.mFormatFlags = kAudioFormatFlagsCanonical | kAudioFormatFlagIsNonInterleaved;
readFileFormat.mChannelsPerFrame = 1;
readFileFormat.mBitsPerChannel = 8 * sizeof(AudioSampleType);
readFileFormat.mFramesPerPacket = 1;
readFileFormat.mBytesPerFrame = sizeof(AudioSampleType);
readFileFormat.mBytesPerPacket = sizeof(AudioSampleType);
readFileFormat.mReserved = 0;

propSize = sizeof(readFileFormat);
error = ExtAudioFileSetProperty(sourceFile, kExtAudioFileProperty_ClientDataFormat, propSize, &readFileFormat);

if(error){
NSLog(@"AudioClip: Error setting read format: %d", error);
[self closeAudioFile];
return NO;
}

//
// Set the format for the output file that we will write
//
propSize = sizeof(targetFileFormat);
memset(&targetFileFormat, 0, sizeof(AudioStreamBasicDescription));

targetFileFormat.mFormatID = kAudioFormatMPEGLayer3;
targetFileFormat.mChannelsPerFrame = 1;

//
// Let the API fill in the rest
//
error = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &propSize, &targetFileFormat);

if(error){
NSLog(@"AudioClip: Error getting target file format info: %d", error);
[self closeAudioFile];
return NO;
}

//
// Create our target file
//
NSURL *writeURL = [NSURL fileURLWithPath:targetFilePath];

error = ExtAudioFileCreateWithURL( (CFURLRef)writeURL, kAudioFileMP3Type,
&targetFileFormat, NULL,
kAudioFileFlags_EraseFile,
&targetFile);

if(error){
NSLog(@"AudioClip: Error opening target file for writing: %d", error);
[self closeAudioFile];
return NO;
}


//
// Set the client format for the output file the same as our client format for the input file
//
propSize = sizeof(readFileFormat);
error = ExtAudioFileSetProperty(targetFile, kExtAudioFileProperty_ClientDataFormat, propSize, &readFileFormat);

if(error){
NSLog(@"AudioClip: Error, cannot set client format for output file: %d", error);
[self closeAudioFile];
return NO;
}

以及读/写的代码:

NSInteger framesToRead = finalFrameNumber - startFrameNumber;

while(framesToRead > 0){
//
// Read frames into our data
//
short *data = (short *)malloc(framesToRead * sizeof(short));
if(!data){
NSLog(@"AudioPlayer: Cannot init memory for read buffer");
[self notifyDelegateFailure];
[self closeAudioFile];
return;
}

AudioBufferList bufferList;
OSStatus error = noErr;
UInt32 loadedPackets = framesToRead;

bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mNumberChannels = 1;
bufferList.mBuffers[0].mData = data;
bufferList.mBuffers[0].mDataByteSize = (framesToRead * sizeof(short));

NSLog(@"AudioClip: Before read nNumberBuffers = %d, mNumberChannels = %d, mData = %p, mDataByteSize = %d",
bufferList.mNumberBuffers, bufferList.mBuffers[0].mNumberChannels, bufferList.mBuffers[0].mData,
bufferList.mBuffers[0].mDataByteSize);

error = ExtAudioFileRead(sourceFile, &loadedPackets, &bufferList);

if(error){
NSLog(@"AudioClip: Error %d from ExtAudioFileRead", error);
[self notifyDelegateFailure];
[self closeAudioFile];
return;
}

//
// Now write the data to our file which will convert it into a mp3 file
//

NSLog(@"AudioClip: After read nNumberBuffers = %d, mNumberChannels = %d, mData = %p, mDataByteSize = %d",
bufferList.mNumberBuffers, bufferList.mBuffers[0].mNumberChannels, bufferList.mBuffers[0].mData,
bufferList.mBuffers[0].mDataByteSize);

error = ExtAudioFileWrite(targetFile, loadedPackets, &bufferList);

if(error){
NSLog(@"AudioClip: Error %d from ExtAudioFileWrite", error);
[self notifyDelegateFailure];
[self closeAudioFile];
return;
}

framesToRead -= loadedPackets;
}

最佳答案

Apple 不提供 MP3 编码器 - 仅提供解码器。源文档有点过时,但据我所知它仍然是最新的:http://developer.apple.com/library/ios/#documentation/MusicAudio/Conceptual/CoreAudioOverview/SupportedAudioFormatsMacOSX/SupportedAudioFormatsMacOSX.html%23//apple_ref/doc/uid/TP40003577-CH7-SW1

我认为最好的选择可能是使用 AAC。

关于iPhone 扩展音频文件服务,mp3 -> PCM -> mp3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021373/

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