非標準のコーデックを使用せずに、Windows Media Player で再生される iPhone でオーディオを録音する必要があります。つまり、まだ WMP に同梱されていないコーデックは使用しません。(企業の要件。) オーディオは base-64 でサーバーに送られる必要があるため、オーディオ サイズをできるだけ小さくする必要があります。8Kb の記録周波数でも、AIFF ファイルは膨大な容量を必要とします。WMP が飲み込める圧縮された AIFF 形式が見つからないようです。
2 に答える
最善の策は、ulaw または alaw 圧縮を使用して WAV ファイルを書き込むことです(あなたmFormatId
の.AudioStreamBasicDescription
kAudioFormatULaw
kAudioFormatALaw
ExtAudioFile インスタンスをセットアップして ulaw を書き込むコードを次に示します。
NSArray * docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * docDir = [docs objectAtIndex:0];
NSURL * outFile = [NSURL fileURLWithPath:[docDir stringByAppendingPathComponent:@"OutFile.wav"]];
AudioStreamBasicDescription asbd;
bzero(&asbd, sizeof(asbd));
asbd.mSampleRate = 11025; // or whatever
asbd.mFramesPerPacket = 1;
asbd.mChannelsPerFrame = 1;
asbd.mFormatID = kAudioFormatULaw; //or kAudioFormatALaw
ExtAudioFileRef theFile;
err = ExtAudioFileCreateWithURL((CFURLRef)outFile,
kAudioFileWAVEType,
&asbd,
0,
kAudioFileFlags_EraseFile,
&theFile);
それが役立つことを願っています。
- - 追加した - -
ulaw 圧縮を取得するための SpeakHere サンプル コードの変更は次のとおりです。
SpeakHereController.mm:116
recordFilePath = (CFStringRef)[NSTemporaryDirectory() stringByAppendingPathComponent: @"recordedFile.wav"];
SpeakHereController.mm:158
recorder->startRecord(CFSTR("recordedFile.wav"));
AQRecorder.mm:192
SetupAudioFormat(kAudioFormatULaw);
AQRecorder.mm:215
XThrowIfError(AudioFileCreateWithURL(url, kAudioFileWAVEType, &mRecordFormat, kAudioFileFlags_EraseFile,
&mRecordFile), "AudioFileCreateWithURL failed");
前回の投稿からずいぶん経ちましたが、user196004 さんが一時フォルダ以外のフォルダに保存できないという問題の解決策を見つけました。
AudioFileCreateWithURL は、CFURLRef を入力として受け取ります。URL が CFURLCreateWithString を使用して作成され、宛先フォルダーにスペースが含まれている場合、URL の作成は失敗します (null)。
解決策は、文字列をエスケープすることです。
CFStringRef fileNameEscaped = CFURLCreateStringByAddingPercentEscapes( NULL, ファイル名, NULL, NULL, kCFStringEncodingUTF8 );