Уменьшить размер преобразованного аудиофайла - PullRequest
2 голосов
/ 08 ноября 2011

Я конвертирую записанное аудио в формате .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 голосов
/ 08 ноября 2011

Распаковка сильно сжатого аудиофайла почти всегда приводит к гораздо большему результирующему файлу, если вы не сжимаете его с использованием еще более сжатого формата сжатия.

...