0

我正在尝试将 AAC 解码为 PCM,一切似乎都正常。问题是我可以在我的音频文件中听到奇怪的声音(像蛇一样):)

音频文件是这个:https ://www.dropbox.com/s/2a6c1m38w1cu0km/myaudiofileWrite.m4a?dl=0

我将 AAC ADTS 解码为 PCM 的方法是:

-(void) audioFileReaderWithData: (NSData *) audioData {

    AudioFileID         refAudioFileID;
    ExtAudioFileRef     inputFileID;


    OSStatus result = AudioFileOpenWithCallbacks((__bridge void * _Nonnull)(audioData), readProc, NULL, getSizeProc, NULL, kAudioFileAAC_ADTSType, &refAudioFileID);
    if(result != noErr){
        NSLog(@"problem in theAudioFileReaderWithData function: result code %i \n", result);
    }

    //kAudioFilePermissionsError
    result = ExtAudioFileWrapAudioFileID(refAudioFileID, false, &inputFileID);
    if (result != noErr){
        NSLog(@"problem in theAudioFileReaderWithData function Wraping the audio FileID: result code %i \n", result);
    }

    // Client Audio Format Description
    AudioStreamBasicDescription clientFormat =[self getAudioDescription];


    //Output Audio Format Description
    AudioStreamBasicDescription outputFormat =[self getAACAudioDescription];

    UInt32 codec = kAppleHardwareAudioCodecManufacturer;
    int size = sizeof(codec);
    result = ExtAudioFileSetProperty(outputFileID,
                                     kExtAudioFileProperty_CodecManufacturer,
                                     size,
                                     &codec);

    if(result) printf("ExtAudioFileSetProperty %d \n", (int)result);

    // create the outputFile that we're writing to here....
    UInt32 outputFormatSize = sizeof(outputFormat);
    result = 0;
    result = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &outputFormatSize, &outputFormat);
    if(result != noErr)
        NSLog(@"could not set the output format with status code %i \n",result);




    size = sizeof(clientFormat);
    result = 0;
    result = ExtAudioFileSetProperty(inputFileID, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat);

    if(result != noErr)
        NSLog(@"error on ExtAudioFileSetProperty for input File with result code %i \n", result);

    size = sizeof(clientFormat);
    result = 0;
    result = ExtAudioFileSetProperty(outputFileID, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat);
    if(result != noErr)
        NSLog(@"error on ExtAudioFileSetProperty for output File with result code %i \n", result);

    int totalFrames = 0;
    UInt32 outputFilePacketPosition = 0; //in bytes
    UInt32 encodedBytes = 0;


    while (1) {
        UInt32 bufferByteSize       = 22050 * 4 * 2;
        char srcBuffer[bufferByteSize];
        UInt32 numFrames            = (bufferByteSize/clientFormat.mBytesPerFrame);

        AudioBufferList fillBufList;
        fillBufList.mNumberBuffers  = 1;
        fillBufList.mBuffers[0].mNumberChannels     = clientFormat.mChannelsPerFrame;
        fillBufList.mBuffers[0].mDataByteSize       = bufferByteSize;
        fillBufList.mBuffers[0].mData               = srcBuffer;
        result = 0;
        result = ExtAudioFileRead(inputFileID, &numFrames, &fillBufList);

        if (result != noErr) {
            NSLog(@"Error on ExtAudioFileRead with result code %i \n", result);
            totalFrames = 0;
            break;
        }
        if (!numFrames)
            break;

        totalFrames = totalFrames + numFrames;

        result = 0;
        result = ExtAudioFileWrite(outputFileID,
                                   numFrames,
                                   &fillBufList);

        if(result!= noErr){
            NSLog(@"ExtAudioFileWrite failed with code %i \n", result);
        }

        encodedBytes += numFrames  * clientFormat.mBytesPerFrame;

    }

    //Clean up

    ExtAudioFileDispose(inputFileID);
    //ExtAudioFileDispose(outputFileID); I'm calling this in other method
    AudioFileClose(refAudioFileID);

}

static OSStatus readProc(void* clientData,
                         SInt64 position,
                         UInt32 requestCount,
                         void* buffer,
                         UInt32* actualCount)
{

    NSData *inAudioData = (__bridge NSData *) clientData;

    size_t dataSize = inAudioData.length;
    size_t bytesToRead = 0;

    if(position < dataSize) {
        size_t bytesAvailable = dataSize - position;
        bytesToRead = requestCount <= bytesAvailable ? requestCount : bytesAvailable;

        [inAudioData getBytes: buffer range:NSMakeRange(position, bytesToRead)];
    } else {
        NSLog(@"data was not read \n");
        bytesToRead = 0;
    }

    if(actualCount)
        *actualCount = bytesToRead;

    return noErr;
}

static SInt64 getSizeProc(void* clientData) {
    NSData *inAudioData = (__bridge NSData *)(clientData);
    size_t dataSize = inAudioData.length;
    return dataSize;
}

格式:

- (AudioStreamBasicDescription)getAudioDescription {
    AudioStreamBasicDescription audioDescription = {0};
    audioDescription.mFormatID          = kAudioFormatLinearPCM;
    audioDescription.mFormatFlags       = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian;
    audioDescription.mChannelsPerFrame  = 1;
    audioDescription.mBytesPerPacket    = sizeof(SInt16)*audioDescription.mChannelsPerFrame;
    audioDescription.mFramesPerPacket   = 1;
    audioDescription.mBytesPerFrame     = sizeof(SInt16)*audioDescription.mChannelsPerFrame;
    audioDescription.mBitsPerChannel    = 8 * sizeof(SInt16);
    audioDescription.mSampleRate        = SAMPLE_RATE_AUDIO;
    return audioDescription;
}

- (AudioStreamBasicDescription)getAACAudioDescription {
    AudioStreamBasicDescription audioFormat;
    audioFormat.mSampleRate = 44100;
    audioFormat.mFormatID = kAudioFormatMPEG4AAC;
    audioFormat.mFormatFlags = kMPEG4Object_AAC_LC;
    audioFormat.mBytesPerPacket= 0;
    audioFormat.mFramesPerPacket= 1024;
    audioFormat.mBytesPerFrame= 0;
    audioFormat.mChannelsPerFrame= 1;
    audioFormat.mBitsPerChannel= 0;
    audioFormat.mReserved= 0;
    return audioFormat;
}

你知道会发生什么吗?

4

0 回答 0