2

AVMutableMetadataItem を使用してファイルのトラック数を更新しようとしています。AVMetadataFormatiTunesMetadata を除いて、私はいくつかの成功を収めています。これを機能させるには、値として何を設定する必要があるのか​​ わからないようです。次のように NSArray のアーカイブを作成しようとしました

[NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:
    [NSNumber numberWithUnsignedInt:13],
    [NSNumber numberWithUnsignedInt:32],
    nil]];

しかし、私は道から外れているトラックとトラックの数になってしまいます。AVMetadataiTunesMetadataKeyTrackNumber のキーを持つ AVMutableMetadataItem の値として正確に何を渡すことになっていますか?

4

2 に答える 2

4

それを理解するのに非常に長い時間がかかりました。Apple の Core Audio のドキュメントに感謝します。対処方法についてはまったく何も書かれていません。または、その問題の他のキーのいずれか。理解する前に、トラック情報を含む MP4 ファイルを調べなければなりませんでした。

答え

トラック情報を含む NSData を割り当てる必要があります。

データは 4 つの 16 ビット ビッグ エンディアン値で構成されている必要があります。2 番目はトラック番号で、3 番目はコレクション内の合計トラック数です。1 番目と 4 番目はゼロにする必要があります。

したがって、基本的にはこれを行う必要があります

int16_t trackNumber = 1; // track number
int16_t tracksInCollection = 12; // total number of tracks in collection
int16_t data[4] = { 0, trackNumber, tracksInCollection, 0 };

metadataItem.keySpace = AVMetadataKeySpaceiTunes;
metadataItem.key = AVMetadataiTunesMetadataKeyTrackNumber;
metadataItem.value = [NSData dataWithBytes:data length:sizeof(data)];

注意: AVMetadataiTunesMetadataKeyDiscNumberキーにも同じアプローチが適用されます。

エンディアンに関する注意事項

バイト順を気にしたくない場合は、Berkeley ソケット API からメソッドを「借りる」ことができます。または、マクロである可能性があります。とにかく、それは次のように機能します:

bigendianval = htons(val);

また

int16_t trackNumber = htons(myTrackNumberVariable);

htons ( Host to network short ) は、システムのエンディアンに関係なく、16 ビットの数値をビッグ エンディアンに変換します。IP ネットワークもビッグエンディアンであるため、htons はここで再利用できます。

于 2013-02-07T13:29:14.520 に答える