それを理解するのに非常に長い時間がかかりました。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 はここで再利用できます。