57
NSDictionary* fileAttributes = 
    [[NSFileManager defaultManager] attributesOfItemAtPath:filename 
                                                     error:nil]

ファイル属性キーから、日付、サイズなどを取得できます。しかし、どのように期間を取得しますか?

4

7 に答える 7

143

NSFileManagerクラス リファレンス「ファイル属性キー」では、曲の長さを返すために使用するキーがないことがわかります。NSFileManagerインスタンスがファイルに関して取得するすべての情報は、ファイル サイズなど、オペレーティング システム内の実際のファイル自体のプロパティに関連しています。NSFileManagerは実際にはファイルを解釈しません。

ファイルの長さを取得するには、ファイルの解釈方法を知っているクラスを使用する必要があります。AVFoundationフレームワークは、まさに必要なクラスAVAssetを提供します。具象サブクラスAVURLAssetを使用してこの抽象クラスのインスタンスをインスタンス化し、持続時間を取得するオーディオ ファイルを指すNSURLを提供できます。次に、そのプロパティをクエリすることで、 AVAssetインスタンスから期間を取得できます。duration

例えば:

AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:audioFileURL options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

AVFoundation は、パフォーマンスと全体的なユーザー エクスペリエンスを向上させるために、高度な非同期フレームワークとして設計されていることに注意してください。メディア ファイルの長さのクエリなどの単純なタスクを実行するだけでも、長時間かかる可能性があり、アプリケーションがハングする可能性があります。AVAsynchronousKeyValueLoading プロトコルを使用して曲の長さを非同期に読み込み、完了ハンドラー ブロックで UI を更新する必要があります。「ブロック プログラミング ガイド」と、 https : //developer.apple.com/videos/wwdc/2010で無料で入手できる「Discovering AV Foundation」というタイトルの WWDC2010 ビデオをご覧ください。

于 2011-08-13T17:32:53.647 に答える
14

For completeness - There is another way to get the duration for a mp3 file:

NSURL * pathToMp3File = ...
NSError *error = nil;
AVAudioPlayer* avAudioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:pathToMp3File error:&error];

double duration = avAudioPlayer.duration; 
avAudioPlayer = nil;

I have used this with no discernible delay.

于 2012-10-31T14:23:22.780 に答える
13

次を使用して、Swiftで同じことを実現できます。

let audioAsset = AVURLAsset.init(url: audioFileURL, options: nil)
let duration = audioAsset.duration
let durationInSeconds = CMTimeGetSeconds(duration)
于 2017-12-24T05:36:14.777 に答える