减小转换后的音频文件的大小

时间:2011-11-08 12:51:07

标签: iphone objective-c ios audio core-audio

我正在将录制的.m4a格式音频转换为.caf格式。录制音频的设置如下:

/* Record settings for recording the audio*/ 
recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
                 [NSNumber numberWithInt:44100.0],AVSampleRateKey,
                 [NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
                 [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                 [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                 [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                 nil];

我使用此功能将音频转换为.caf:

-(NSString *)handleConvertToPCM:(NSURL *)convertUrl 
{
    [self performSelectorOnMainThread:@selector(showActivity) withObject:nil waitUntilDone:NO];

    DEBUG_LOG(@"DEBUGGING");
    DEBUG_LOG(@"handleConvertToPCM");
    // open an ExtAudioFile
    NSLog (@"opening %@", convertUrl);
    ExtAudioFileRef inputFile;
    CheckResult (ExtAudioFileOpenURL((CFURLRef)convertUrl, &inputFile),
                 "ExtAudioFileOpenURL failed");
    // prepare to convert to a plain ol' PCM format
    AudioStreamBasicDescription requiredPCMFormat;
    requiredPCMFormat.mSampleRate = 44100; // todo: or use source rate?
    requiredPCMFormat.mFormatID = kAudioFormatLinearPCM ;
    requiredPCMFormat.mFormatFlags =  kAudioFormatFlagsCanonical;   
    requiredPCMFormat.mChannelsPerFrame = 2;
    requiredPCMFormat.mFramesPerPacket = 1;
    requiredPCMFormat.mBitsPerChannel = 16;
    requiredPCMFormat.mBytesPerPacket = 4;
    requiredPCMFormat.mBytesPerFrame = 4;
    CheckResult (ExtAudioFileSetProperty(inputFile, kExtAudioFileProperty_ClientDataFormat,
                                         sizeof (requiredPCMFormat), &requiredPCMFormat),
                 "ExtAudioFileSetProperty failed");
    // allocate a big buffer. size can be arbitrary for ExtAudioFile.
    UInt32 outputBufferSize = 0x10000;
    void* ioBuf = malloc (outputBufferSize);
    UInt32 sizePerPacket = requiredPCMFormat.mBytesPerPacket;   
    UInt32 packetsPerBuffer = outputBufferSize / sizePerPacket;
    // set up output file   
    self.outputPath = [NSString stringWithFormat:@"%@/export-pcm.caf",DOCUMENTS_FOLDER];
    self.outputURL = [NSURL fileURLWithPath:self.outputPath];
    DEBUG_LOG(@"creating output file %@", self.outputURL);
    AudioFileID outputFile;
    CheckResult(AudioFileCreateWithURL((CFURLRef)outputURL,
                                       kAudioFileCAFType,
                                       &requiredPCMFormat, 
                                       kAudioFileFlags_EraseFile, 
                                       &outputFile),
                "AudioFileCreateWithURL failed");
    // start convertin'
    UInt32 outputFilePacketPosition = 0; //in bytes
    while (true) 
    {
        // wrap the destination buffer in an AudioBufferList
        AudioBufferList convertedData;
        convertedData.mNumberBuffers = 1;
        convertedData.mBuffers[0].mNumberChannels = requiredPCMFormat.mChannelsPerFrame;
        convertedData.mBuffers[0].mDataByteSize = outputBufferSize;
        convertedData.mBuffers[0].mData = ioBuf;
        UInt32 frameCount = packetsPerBuffer;
        // read from the extaudiofile
        CheckResult (ExtAudioFileRead(inputFile,
                                      &frameCount,
                                      &convertedData),
                     "Couldn't read from input file");
        if (frameCount == 0) 
        {
            printf ("done reading from file");
            break;
        }
        // write the converted data to the output file
        CheckResult (AudioFileWritePackets(outputFile,
                                           false,
                                           frameCount,
                                           NULL,
                                           outputFilePacketPosition / requiredPCMFormat.mBytesPerPacket, 
                                           &frameCount,
                                           convertedData.mBuffers[0].mData),
                     "Couldn't write packets to file");

        DEBUG_LOG(@"Converted %ld bytes", outputFilePacketPosition);
        // advance the output file write location
        outputFilePacketPosition += (frameCount * requiredPCMFormat.mBytesPerPacket);
    }
    // clean up
    ExtAudioFileDispose(inputFile);
    AudioFileClose(outputFile);
    return(self.outputPath);    

}

我的问题是转换文件的大小与转换文件相比非常高。无论如何,通过更改转换设置来减小大小。 我尝试压缩获得的文件,但压缩需要很长时间。所以我想找到一种方法来减小尺寸和转换。

1 个答案:

答案 0 :(得分:0)

解压缩高度压缩的音频文件几乎总会产生更大的结果文件,除非您使用更加有损的压缩格式重新压缩。