Introduction

仕事で video_player を使って動画を再生していたのだが、 iPhone 実機だと再生できるのに、iOS シミュレータだと再生できない動画ファイルが見つかって不安に思って調べた。

Why?

ChatGPT に聞いたら

MacやiOSシミュレーターは、実機で使用可能なすべてのハードウェアデコーダやソフトウェアコーデックをサポートしていないため、一部のMP4ファイルが再生できないケースが存在します

とのこと。

具体的には WebM 動画から mp4 に ffmpeg で変換した動画がこの事象に当てはまった。
下記のように変換していた。

1
2
$ ffmpeg -y -i input.webm  -vf "palettegen" palette.png
$ ffmpeg -y -i input.webm -i palette.png -filter_complex "fps=30,paletteuse" -c:v libx264 output.mp4

実は、GIF アニメーションを綺麗に生成するために、パレットを生成して変換していたことがあり、元の webM もイラスト調のアニメーションだったので同様な変換方法を使ったのが問題になった。
パレットを使うのは GIF アニメーションを生成する時だけなので、余計なことをしたわけだ。

本来は下記のシンプルなコマンドで問題は起きない。

1
$ ffmpeg -y -i input.webm output.mp4

調査しているとき、最初は Video not working on 16.4 simulator と思ったが、様々な iOS シミュレータを試しても、iOS シミュレータのバージョンに関係なく再生できなかった。
下記は上の url で話題になっていた iOS 16.4 以外に、iOS 16.2、iOS 16.1、iOS 15.5 を試した際のスクリーンショット。

firewall

実際に MacOS 15.3 で QuickTime で再生を試みるも

firewall

と言われ再生できない。

ffprobe を使って再生できる mp4 と比較してみると、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  ffprobe version 7.1 Copyright (c) 2007-2024 the FFmpeg developers
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf61.7.100
- Duration: 00:00:30.03, start: 0.000000, bitrate: 1027 kb/s
- Stream #0:0[0x1](und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p(tv, bt470bg/unknown/unknown, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 1023 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
+ Duration: 00:00:30.03, start: 0.000000, bitrate: 1004 kb/s
+ Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt470bg/unknown/unknown, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 1000 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc61.19.100 libx264
  • Video の 4:4:4 Predictive 濃霧
  • yuv444pyuv420p

の違いがあった。

なので、 ffmpeg で動画を変換する際、下記のように -profile:v high -pix_fmt yuv420p を引数に追加して変換する。

1
2
$ ffmpeg -y -i input.webm  -vf "palettegen" palette.png
$ ffmpeg -y -i input.webm -i palette.png -filter_complex "fps=30,paletteuse" -c:v libx264 -profile:v high -pix_fmt yuv420p output.mp4

これで再生できるようになる。

firewall