2017-07-03 70 views
1

mutagenで私の音楽ライブラリにタグを付けるスクリプトを書く際に問題が発生しました。 次のコードは、mp3ファイルを扱う際に問題なく動作しますが、m4aファイルが破損しています。 M4Aファイルを処理した後mutagenを使ってm4aファイルにID3タグを追加することは可能ですか?

def set_video_tags(video, filepath): 
    try: 
     tags = ID3(filepath, v2_version=3) 
    except ID3NoHeaderError: 
     tags = ID3() 

    tags.add(TXXX(3, desc='desc:custom_tag',text= video.custom_text)) 
    tags.save(filepath, v2_version=3) 

、タグが変異原を使用してリードバックすることができますが、他のプレイヤーによって検出されていないと音声が再生されません。

この関数を呼び出す前にファイルからMP4タグを削除しようとしましたが、役に立たなかった。

私は間違っていますか?

+0

MP3!= MP4、なぜM4AファイルでID3を使用しようとしていますか? Googleに突入するのは難しかったのですか?突然変異誘発m4aタグと、[非常に最初のリンク](http://mutagen.readthedocs.io/en/latest/api/mp4.html)に行きます。 MP4ファイルのタグを編集するのに使用しますか? – zwer

+0

PythonとOSのどちらのバージョンですか? –

+0

@Anthony Kong python3.6 on windows10 – dobrovv

答えて

3

私のコメントで言いましたように、MP4とMP3は異なるコンテナであり、メタデータを格納するために全く異なる構造を使用します。技術的には、MP4メタデータ内のID3フィールドをエンコードすることができますが、それを行う方法はたくさんあり、その結果、自分の構造をプッシュする最善の方法を持っていると思うので、その使用はタグ/プレーヤーに大きく左右されます。

MP3コンテナ用のID3とは何ですか、XMPはMP4/M4Aコンテナ用です(また、JPEG、PDF、さらにMP3などの他の多くのコンテナ用です)。ただし、XMPは実際の標準で、ID3は(元々はMP3ファイルの最後に追加された最後の構造であった)後で考えてみると、WinAmp、foobar2000などのような大衆的な人気を誇るプレイヤーが主体になっていました。これとは対照的に、XMPは本質的に原子フィードのような構造である(なぜなら、mp4タグは同じものを指していなくても「原子」とも呼ばれていると聞くだろう)。そのメタデータは、最初に遭遇したプレイヤーでさえも、理論的には無関係のメタデータとの関連性を見分けることができます。

実際にはこれもプレイヤーとタガー戦争に変わったので、多くの人がカスタムの「拡張機能」を使ってタグ付けしています。現在、iTunesはフィールドの使い方と方法を大いに揺さぶっています。他の選手のボールの種類 - mutagenです。単一のXMP構造の代わりに、iTunesはMP4構造体自体に非ビデオ/オーディオフレーム(実際の「原子」)としてタグを展開し、いくつかの「タグ」は奇妙な名前(バイナリ名など)フォーマット自体を妨害します。この方法には利点がありますが(ストリーミングでメタデータを変更するとライブイベントに非常に便利です)、タグ付けは不必要に複雑になり、また非標準的になります。

とにかく、ID3構造体をMP4コンテナに書き込もうとしているので、ID3タグを書き込むときに問題が発生します。mutagenは、ファイル全体を解析して基礎ファイルがID3をサポートしているかどうか代わりに、それは正規のMP3ファイルを与えられていると仮定し、間違ったフォーマットで間違った場所に書き留めます。これは、ファイルの末尾にガベージを追加するだけです(以前のストリーム不可能なID3バージョン)。その結果、M4Aコンテナが破損します。ファイルを読み込んだときにも同じことが起こります。以前は予測可能な場所に書き込んだID3構造体を読み取ることができますが、残りのデータは気にしません。

MP4/M4Aコンテナを扱うときは、MP4コンテナで動作するように、mutagen.mp4.MP4(またはその下のmutagen.mp4.MP4Tags)を使用してください。

from mutagen.mp4 import MP4 

def get_description(filename): 
    return MP4(filename).tags.get("desc", [None])[-1] 

def set_description(filename, description): 
    tags = MP4(filename).tags 
    tags["desc"] = description 
    tags.save(filename) 

注:「タグ」ごとに複数のエントリが既存のタグのように返すようにサポートされているように私はget_description()機能で唯一の最後のdescエントリを使用していますが、あなたがしようとしているとして例えば、descタグを変更するにはリスト。あなたは明らかに生産環境で上記を使用していないでしょう。あなたがmutagen.mp4.MP4Tagドキュメントを確認することができます「はサポート」(というかiTunesは、うーん、奨励)キーのフルセットのために

print("Current description: {}".format(get_description("test.m4a"))) 
# Current description: None 

set_description("test.m4a", "Test description") # let's add some description 
print("Current description: {}".format(get_description("test.m4a"))) 
# Current description: Test description 

# You can also modify the description once set: 
set_description("test.m4a", get_description("test.m4a") + " update") 
print("Current description: {}".format(get_description("test.m4a"))) 
# Current description: Test description update 

# etc. 

あなたはでそれをテストすることができます。もちろん、自由形式の構造(つまり、----:foo:bar)を使用して独自の鍵を作成することはできますが、他のプレーヤーがそれらを認識することは期待していません。

関連する問題