4

iOSアプリを作っています。その機能の 1 つは、レコードを保存し、オーディオ ファイルを保存できることです。

録音したオーディオ ファイルの URL を保存するために、次のようにファイル パスとして NSUserDefaults に保存します。

file:///var/mobile/Containers/Data/Application/17F8E799-D7E1-4B3C-9DFE-7BA48E346314/Documents/recordName.aif

「FVSoundWaveDemo」というライブラリを使用して、録音したファイルの音波を表示しようとしています。しかし、URLに問題があります...

「FVSoundWaveDemo」の例では、ローカルにインポートされたファイルを次のようにロードします。

NSString* filename = [NSString stringWithFormat:@"song1.m4a"];
NSURL* url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
_soundWaveView.soundURL = url;

「song1.m4a」というビットが表示されますが、それを置き換えて、アプリが代わりに filePath URL を使用するようにしたいと考えています。上記の質問で表示した filePath URL のように。

filePath を通常の URL に「変換」しようとしたり、AVAssets を使用しようとしたりするなど、あらゆる種類のことを試しました。しかし、私が試したことはすべて、このエラーが発生するだけです:

キャッチされていない例外 'NSRangeException' が原因でアプリを終了しています。理由: '*** -[__NSArrayM objectAtIndex:]: インデックス 0 が空の配列の境界を超えています'

これは、私が使用しているライブラリが AVAssets を次のように使用するためです。

AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:songAsset error:&error];

AVAssetTrack* songTrack = [songAsset.tracks objectAtIndex:0];

NSDictionary* outputSettingsDict = [[NSDictionary alloc] initWithObjectsAndKeys:
                                    [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
                                    [NSNumber numberWithInt:1],AVNumberOfChannelsKey,
                                    [NSNumber numberWithInt:8],AVLinearPCMBitDepthKey,
                                    [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                                    [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                                    [NSNumber numberWithBool:NO],AVLinearPCMIsNonInterleaved,
                                    nil];

では、どうすれば AVAsset を filePath URL だけで動作させることができるでしょうか?

開発者がXcodeプロジェクトに追加できるローカルにインポートされたオーディオファイルではなく、アプリによって保存された録音されたオーディオファイルを表示しようとしていることに注意してください。

私はこれで何日も立ち往生しています。あなたが私を助けることができれば、それは大歓迎です、ありがとう.

時間をありがとう、ダン。

4

2 に答える 2

4

最後にそれを理解しました。動作させるために、次の変更を加えました。

1)次のように、URLWithString の代わりに fileURLWithPath を使用しました。

NSURL *assetURL = [NSURL fileURLWithPath:passURL];
AVURLAsset *asset = [AVURLAsset assetWithURL:assetURL];

2) オーディオ ファイルの URL を保存する前に、次のように NSString として保存するようにしました。

file:///var/mobile/Containers/Data/Application/17F8E799-D7E1-4B3C-9DFE-7BA48E346314/Documents/recordName.aif

これは、AVPlayer などを使用する場合には機能しません。代わりに、文字列の先頭に「file:///」ビットが含まれないように URL を保存する必要があります。これを行うには、次のように文字列パスの NSURL ではなく、文字列パス値を保存してください。

    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath_ = [searchPaths objectAtIndex:0];
    NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:@"audioName.aif"];

"pathToSave" NSString を任意の場所に保存し、ファイルをロードするときにそれを使用します。これを行うと、音声ファイルの URL が次のように保存されます。

/var/mobile/Containers/Data/Application/45ABF4BD-FA0E-43F7-B936-7DE29D8F28ED/Documents/23Feb2015_074118pm.aif

先頭に「file:///」ビットがないことがわかります。この文字列は、この回答のパート 1 で機能するようになりました。

これが私と同様の問題を抱えている人に役立つことを願っています。

于 2015-02-23T19:51:18.550 に答える
0

このようなもの?

NSURL* assetURL = [NSURL URLWithString:@"file://your-file.aif"];
AVURLAsset* asset  = [AVURLAsset URLAssetWithURL:assetURL options:nil];
于 2015-02-22T22:05:05.337 に答える