pythonでmediainfoをたたいてみる(iphone動画)

# はじめに
mp4の動画ファイルとはいえ、コーデックや解像度などは多種多様にある昨今、特にiphoneなどのモバイルデバイスやネット上で手に入る高解像度の動画ファイルは本当に高解像度ファイルなのか、実際にはどんな動画情報を持っているのかが少し気になりました。

単純なpythonなどのスクリプトを書いて、手元にある動画ファイルからコーデックや解像度などの動画情報を取得することはできないか調べてみました。最終的にYoutubeへのアップロードまで行い、プラットフォームを通しての再生もできるか確認してみました。


まとめると、本記事でやりたいことは以下です。

- iphoneカメラを4K設定にして動画を撮影する
- 保存された動画情報の取得＆検証
- Youtubeでの動画アップロード＆再生


結果を述べると、**iphoneカメラで撮影した4K映像は、4K動画の情報をしっかり持っていることをpythonスクリプトで確認できました。またYoutubeプラットフォームでしっかり4Kで再生できました。**


# ファイルの用意
情報取得の対象とする動画ファイルはiphoneで撮った4K動画を使いました。iphoneで撮影し、imovieで繋げただけです。iphoneのカメラは新しめの機種では4K動画を撮ることができます。またHDRモードでも撮ることができ、ものによってはデフォルトでONになっているようです。

https://support.apple.com/ja-jp/HT211798

iphoneの技術仕様を確認したところ、HDRでの撮影が可能なようでした。今回用意した動画はiphoneのカメラ設定で

- 4K
- 60fps
- HDR ON

の設定にして撮影してみました。これっぽいデータが動画に保存されているかをスクリプトで取得してみます。

# プログラムの用意
## MediaInfoのインストール
今回のやりたいこと実現にあたり、適していそうなMediaInfoというツールがあります。これを使えばコマンドラインから動画情報を調べることができそうです。スクリプトを書くにあたり、Pythonとかで該当のパッケージがないか調べてみたところ、pymediainfoというものがありました。

https://pypi.org/project/pymediainfo/

pip でインストールできそうなので、手元の開発環境に入れておきます。

```
pip install pymediainfo
```



## Pythonのスクリプト用意

コードはほぼ以下からコピペにて借用しました。

https://pymediainfo.readthedocs.io/en/stable/


```
from pprint import pprint
from pymediainfo import MediaInfo

media_info = MediaInfo.parse("動画ファイルのパスを指定")
for track in media_info.tracks:
    if track.track_type == "Video":
        print("Video Track data:")
        print("Bit rate: {t.bit_rate}, Frame rate: {t.frame_rate}, Format: {t.format}, Format profile: {t.format_profile}, "
                "bit:{t.bit_depth}, color space:{t.color_primaries}, LogCurved:{t.transfer_characteristics}, Scan:{t.scan_type}".format(t=track)
        )
        print("Width:{t.width}, Height:{t.height}".format(t=track))
        print("Duration (raw value):", track.duration)
        print("Duration (other values:")
        pprint(track.other_duration)

    elif track.track_type == "Audio":
        print("Audio Track data:")
        pprint(track.to_data())
```

多少欲しい要素を増やすためにコードを書き換えています。ターゲットの動画はiphoneの動画形式だったMOVでしたが、mp4でもしっかり動作しました。

iphoneで撮った動画に対しての出力は以下(Audioの部分は省略)。

```
Video Track data:
Bit rate: 25123961, Frame rate: 30.000, Format: HEVC, Format profile: Main 10@L5.1@Main, bit:10, color space:BT.2020, LogCurved:HLG, Scan:None
Width:3840, Height:2160
Duration (raw value): 109133
Duration (other values:
['1 min 49 s',
 '1 min 49 s 133 ms',
 '1 min 49 s',
 '00:01:49.133',
 '00:01:49:04',
 '00:01:49.133 (00:01:49:04)']
```

少しずつ検証してみます。
まず、ビットレートは25.123961 Mbit/s とでています。検索して一番最初にでてきた以下のサイトでは、動きの少ない4K映像が25Mbps～35Mbpsとでているので、まあまあ順当な値なのかなと思います。

https://www.stream.co.jp/blog/blogpost-32369/

次に、フレームレートについて、30fpsになっています。カメラ設定では60にしたはず...と思い、余計な設定が入っていなかったか確認してみました。iphoneのカメラには「FPS自動調整」という機能があるようで、これが影響したのかなと思います。

解像度部分を見てみると、Width:3840, Height:2160となっています。FHDの4倍サイズのため、しっかりと4KUHDの解像度の情報が保存できているかなと思います。

コーデックを確認してみます。HEVC h.265での圧縮ができているようです。Main10@5.1のため、iphoneでも4K動画としてしっかり撮れているのかなと思います。

今回の動画ファイルはHDR設定もONにして撮っています。カーブがHLG(hybrid log gamma)、カラースペースがBT.2020、ビット深度は10bitとHDRっぽい値がしっかり取得できているのがわかります。

色々データを見てみましたが結論としてこの動画ファイルはしっかり4Kファイルとして保存されており、4K対応の動画配信サイトにアップしたら、きちんと再生できると思います。実際にやってみます。

## youtubeへのアップロード

youtubeへのアップはyoutube studioから実施します。実際にgoogleでアップロード用のアカウントを作成し、該当の動画をアップロードしてみます。アップロードした後の動画は以下。

https://www.youtube.com/watch?v=Msymx_J-bXk

こちらでiphoneデバイス(ディスプレイはXDR対応)から確認すると、4K(2160p)HDR画質で再生できるようになっていることがわかります。iphoneの4Kカメラでとった映像をimovieで編集し、そのまま4KでYoutubeで再生できることがわかりました。

注意点として、Youtubeへの動画ファイルのアップロードすると、まず低解像度ファイルから動画の処理が始まります。そのため最初は360pしか再生画質を選べないので、なにか設定ミスがあったかな??と最初は戸惑いました。しばらくほっておくとしっかりと高解像度も認識して選べるようになりました。各解像度の処理の進捗についてはYoutube Studioから確認できます。

# おわりに
今回は動画情報を手元のスクリプトで簡単に動画ファイル(mp4とかMOVとか)から取得できるかやってみました。繰り返しになってしまいますが、
**iphoneカメラで撮影した4K映像は、4K動画の情報をしっかり持っていることをpythonスクリプトで確認できました。またYoutubeプラットフォームでしっかり4Kで再生できました。**

- iphoneは4KやHDR動画の撮影設定ができるため、その設定で動画を撮影してみました。
- 動画情報の取得は、pythonであれば、**pymediainfo**がお手頃で使いやすそうでした。
- 時間はかかりましたが、Youtubeでしっかりと4kHDRで再生できました。