2011-11-08 44 views
2

我正在将我录制的.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);  

} 

我的问题是,相比转换后的文件的大小是非常高的转换为文件。无论如何,通过更改转换设置来减小大小。 我试图压缩获得的文件,但它需要很多时间来压缩。所以我想获得一种方法来减少大小以及转换。

+0

您正在将MP4文件解码为普通PCM。这肯定会导致规模的大幅增加。你为什么首先转换文件? – Till

+0

它的要求是这样的。任何方式来减小尺寸。将设置的任何改变工作?我尝试了一些,但失败了。 – Siddharth

+0

我并不熟悉在iOs中编写音乐,但在使用工具转换声音时,我的游戏将从立体声转换为单声道,因此尺寸减小了一半。也许mono对你来说已经足够了? – TheEye

回答

0

解压缩高度压缩的音频文件几乎总是会导致更大的结果文件,除非您使用更均匀的压缩格式进行重新压缩。

+0

有没有什么方法可以重新压缩比较不耗时的音频? – Siddharth

+0

我需要caf格式 – Siddharth

+1

对于caf格式,文件大小将与采样率(通常为44.1kHz)乘以每采样位数(通常为16位或2字节)乘以通道数(1,2或5)成比例),以秒为单位乘以音频的长度。你想减少哪个? – hotpaw2