2

ホール ファイルをダウンロードせずに ID3 タグ (特に期間) を取得することはできますか?

http URL から mp3 ファイルの長さを取得する必要があります。

私はこれをやろうとしました:

AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; NSString *duration = [NSString stringWithFormat:@"%.2f",CMTimeGetSeconds(asset.duration)];

ただし、特に大きなファイルの場合は時間がかかります。何かアイデアはありますか?

4

1 に答える 1

2

短い答え: ID3v2 タグの場合ははい

どの ID3 タグのバージョンを読み取ろうとしていますか?

ID3v1 タグは、ファイルの最後、最後の 128 バイトにあります。Net::HTTP では、ファイルの最後に向かってシークし、最後の N バイトだけを読み取ることはできないようです。headers = {"Range" => "bytes=128-"} を使用して試してみると、常に完全なファイルがダウンロードされるようです。resp.body.size => ファイルサイズ。しかし、ID3 バージョン 1 は、固定長形式、ASCII テキストのみなどの制限により、この時点でかなり時代遅れになっているため、大きな損失はありません...)。iTunes は ID3 バージョン 2.2.0 を使用します。

ID3v2 タグはファイルの先頭にあります - ストリーミングをサポートするため - ID3v2 ヘッダーを含む MP3 ファイルの最初の部分を HTTP プロトコル >= 1.1 経由でダウンロードできます

以前、特に Ruby の実装に関する質問にほぼ同じ回答をしました。

この質問を確認してください: Ruby/Rails でリモート MP3 ファイルの ID3 タグを読みますか?


続き.. 私が言及した他の質問の Ruby コードは、完全に機能する例です。

完全なID3タグが含まれていると想定するのに十分な大きさの、フェッチするバイトの事前定義されたサイズを設定できます。たとえば、1000バイトです。

次に、使用する言語に関係なく、お気に入りの HTTP ライブラリを使用して HTTP 接続を開きますが、HTTP プロトコルのバージョンが >= 1.1 であることを確認し、HTTP オプション "Range" を使用して最初の 1000 バイトを読み取ります。 HTTP 経由でアクセスしようとしているファイルから指定された範囲のバイトをダウンロードします。

iOS での具体的な実装は、使用するライブラリによって異なります。

Objective-C での GET リクエストの例を次に示します。 シンプルな Objective-C GET リクエスト

必要なのは、範囲を指定する Range-header をリクエストに渡すことだけです。

API を参照してください: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableURLRequest_Class/Reference/Reference.html

また、Range ヘッダー フィールドをどのようにフォーマットする必要があるかについては、例を確認してください。

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

たとえば、これは Range ヘッダーの構文です。

 Range: bytes=0-1000

addValue:forHTTPHeaderField インスタンス メソッドを使用して、このヘッダーを設定する必要があります。

于 2013-04-11T09:06:10.123 に答える