0

Appleの開発者サイトにあるSpeakHearサンプルアプリを使用して、オーディオ録音アプリを作成しています。kAudioFormatAppleIMA4システム定数を使用してIMA4形式に直接記録しようとしています。これは使用可能な形式の1つとしてリストされていますが、オーディオ形式変数を設定して渡し、設定するたびに、「fmt?」が表示されます。エラー。オーディオフォーマット変数を設定するために使用するコードは次のとおりです。

#define kAudioRecordingFormat kAudioFormatAppleIMA4
#define kAudioRecordingType kAudioFileCAFType
#define kAudioRecordingSampleRate 16000.00
#define kAudioRecordingChannelsPerFrame 1
#define kAudioRecordingFramesPerPacket 1
#define kAudioRecordingBitsPerChannel 16
#define kAudioRecordingBytesPerPacket 2
#define kAudioRecordingBytesPerFrame 2

- (void) setupAudioFormat: (UInt32) formatID {

    // Obtains the hardware sample rate for use in the recording
    // audio format. Each time the audio route changes, the sample rate
    // needs to get updated.
    UInt32 propertySize = sizeof (self.hardwareSampleRate);

    OSStatus err = AudioSessionGetProperty (
        kAudioSessionProperty_CurrentHardwareSampleRate,
        &propertySize,
        &hardwareSampleRate
    );

    if(err != 0){
        NSLog(@"AudioRecorder::setupAudioFormat - error getting audio session property");
    }

    audioFormat.mSampleRate = kAudioRecordingSampleRate;

    NSLog (@"Hardware sample rate = %f", self.audioFormat.mSampleRate);

    audioFormat.mFormatID           = formatID;
    audioFormat.mChannelsPerFrame   = kAudioRecordingChannelsPerFrame;
    audioFormat.mFormatFlags        = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
    audioFormat.mFramesPerPacket    = kAudioRecordingFramesPerPacket;
    audioFormat.mBitsPerChannel     = kAudioRecordingBitsPerChannel;
    audioFormat.mBytesPerPacket     = kAudioRecordingBytesPerPacket;
    audioFormat.mBytesPerFrame      = kAudioRecordingBytesPerFrame;

}

そして、ここで私はその機能を使用します:

- (id) initWithURL: fileURL {
    NSLog (@"initializing a recorder object.");
    self = [super init];

    if (self != nil) {

        // Specify the recording format. Options are:
        //
        //      kAudioFormatLinearPCM
        //      kAudioFormatAppleLossless
        //      kAudioFormatAppleIMA4
        //      kAudioFormatiLBC
        //      kAudioFormatULaw
        //      kAudioFormatALaw
        //
        // When targeting the Simulator, SpeakHere uses linear PCM regardless of the format
        //  specified here. See the setupAudioFormat: method in this file.
        [self setupAudioFormat: kAudioRecordingFormat];

        OSStatus result =   AudioQueueNewInput (
                                &audioFormat,
                                recordingCallback,
                                self,                   // userData
                                NULL,                   // run loop
                                NULL,                   // run loop mode
                                0,                      // flags
                                &queueObject
                            );

        NSLog (@"Attempted to create new recording audio queue object. Result: %f", result);

        // get the recording format back from the audio queue's audio converter --
        //  the file may require a more specific stream description than was 
        //  necessary to create the encoder.
        UInt32 sizeOfRecordingFormatASBDStruct = sizeof (audioFormat);

        AudioQueueGetProperty (
            queueObject,
            kAudioQueueProperty_StreamDescription,  // this constant is only available in iPhone OS
            &audioFormat,
            &sizeOfRecordingFormatASBDStruct
        );

        AudioQueueAddPropertyListener (
            [self queueObject],
            kAudioQueueProperty_IsRunning,
            audioQueuePropertyListenerCallback,
            self
        );

        [self setAudioFileURL: (CFURLRef) fileURL];

        [self enableLevelMetering];
    }
    return self;
} 

助けてくれてありがとう!-マット

4

2 に答える 2

3

あなたが渡しているすべてのフォーマットフラグが正しいかどうかはわかりません。IMA4 (IIRC は IMA ADPCM 4:1 の略) は 4 ビット (16 ビットからの 4:1 圧縮) で、いくつかのヘッダーがあります。

AudioStreamBasicDescriptionのドキュメントによると:

  • フォーマットが圧縮されているため、mBytesPerFrame は 0 である必要があります。
  • フォーマットは圧縮されているため、mBitsPerChannel は 0 である必要があります。
  • 選択するものがないため、mFormatFlags はおそらく 0 である必要があります。

Aに従って、次がafconvert -f caff -t ima4 -c 1 blah.aiff blah.caf続きafinfo blah.cafます:

  • mBytesPerPacket は 34 である必要があります。
  • mFramesPerPacket は 64 にする必要があります。代わりに、これらを 0 に設定できる場合があります。

元の IMA 仕様のリファレンス アルゴリズムはあまり役に立ちません (これはスキャンの OCR であり、サイトにもスキャンがあります)。

于 2010-09-28T22:56:17.517 に答える
1

何@tcの上に。すでに述べましたが、これを使用して ID に基づいて説明を自動的に入力する方が簡単です。

AudioStreamBasicDescription streamDescription;
UInt32 streamDesSize = sizeof(streamDescription);
memset(&streamDescription, 0, streamDesSize);
streamDescription.mFormatID         = kAudioFormatiLBC;

OSStatus status;
status = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &streamDesSize, &streamDescription);
assert(status==noErr);

これにより、特定のフォーマットの機能を推測する必要がなくなります。この例でkAudioFormatiLBCは他の追加情報は必要ありませんが、他の形式では必要です (通常はチャネル数とサンプル レート)。

于 2012-10-10T18:54:35.660 に答える