🐈
Swift AVFoundation 12900エラーの対処
1. AVFounationにてエラー発生
AVFoundationを使ってデバイスローカルに保存した.movファイルを再生しようとしたら以下のエラーになった。
Optional(Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (-12900), NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x3025c3b10 {Error Domain=NSOSStatusErrorDomain Code=-12900 "(null)"}})
Googleで調べてみると、以下のページだけヒットした。
kVTPropertyNotSupportedErr = -12900,
とのこと。うーん、よく分からんが、たぶんファイル形式/フォーマットが良くないのだろう。
2. エラーが起きないファイルとの差分を調査
たまたま、このエラーが起きない動画ファイルがあったので、エラーが起きるファイルとの差分を調べてみた。
| 比較項目 | エラーが起きないファイル | エラーが起きるファイル |
|---|---|---|
| ファイル形式 | mp4 | mov |
| フォーマット名 | mov,mp4,m4a,3gp,3g2,mj2 | mov,mp4,m4a,3gp,3g2,mj2 |
| フォーマット長い名前 | QuickTime / MOV | QuickTime / MOV |
| メジャーブランド | isom | qt |
| マイナーバージョン | 512 | 0 |
| 互換性のあるブランド | isomdby1iso2mp41 | qt |
| エンコードタグ | Lavf61.1.100 | qt |
| ビットレート | 339,558,103 | 54,495,817 |
| サイズ | 213,242,489バイト | 34,604,844バイト |
| フレームレート | 60/1 | 25/1 |
| 平均フレームレート | 60/1 | 3150/127 |
| 映像コーデック | hevc | hevc |
| 映像コーデックの長い名前 | H.265 / HEVC (High Efficiency Video Coding) | H.265 / HEVC (High Efficiency Video Coding) |
| プロファイル | Main | Main |
| 映像コーデックタグ | hvc1 | hvc1 |
| 映像タグ | 0x31637668 | 0x31637668 |
| 解像度 (幅 x 高さ) | 8192 x 8192 | 8192 x 8192 |
| コーディングされた幅 x 高さ | 8192 x 8192 | 8192 x 8192 |
| 閉じられたキャプション | 0 | 0 |
| フィルムグレイン | 0 | 0 |
| Bフレームの有無 | なし (has_b_frames=0) | あり (has_b_frames=2) |
| サンプルアスペクト比 | N/A | N/A |
| 表示アスペクト比 | N/A | N/A |
| ピクセルフォーマット | yuv420p | yuv420p |
| レベル | 255 | 255 |
| 色範囲 | tv | tv |
| 色空間 | bt709 | bt709 |
| 色伝達 | bt709 | bt709 |
| 色原色 | bt709 | bt709 |
| クロマ配置 | left | left |
| フィールドオーダー | progressive | progressive |
| 参照フレーム数 | 1 | 1 |
| タイムベース | 1/15360 | 1/12800 |
| 開始PTS | 0 | 0 |
| 開始時間 | 0.000000 | 0.000000 |
| 持続時間 (TS) | 76800 | 65024 |
| 持続時間 (秒) | 5.000000 | 5.080000 |
| エクストラデータサイズ | 111 | 150 |
| フレーム数 | 300 | 126 |
| オーディオコーデック | eac3 | eac3 |
| オーディオコーデックの長い名前 | ATSC A/52B (AC-3, E-AC-3) | ATSC A/52B (AC-3, E-AC-3) |
| サンプルフォーマット | fltp | fltp |
| サンプルレート | 48000 | 48000 |
| チャンネル数 | 2 | 2 |
| チャンネルレイアウト | stereo | stereo |
| オーディオビットレート | 256,000 | 288,000 |
| オーディオの持続時間 (TS) | 241152 | 240000 |
| オーディオの持続時間 (秒) | 5.024000 | 5.000000 |
| オーディオフレーム数 | 157 | 157 |
| ディスポジション (全般) | default=1, dub=0, original=0, comment=0, lyrics=0, karaoke=0, forced=0, hearing_impaired=0, visual_impaired=0, clean_effects=0, attached_pic=0, timed_thumbnails=0, non_diegetic=0 | default=1, dub=0, original=0, comment=0, lyrics=0, karaoke=0, forced=0, hearing_impaired=0, visual_impaired=0, clean_effects=0, attached_pic=0, timed_thumbnails=0, non_diegetic=0 |
| タグ (映像) | language=und, handler_name=Core Media Video, vendor_id=[0][0][0][0], encoder=Lavc61.3.100 hevc_videotoolbox | language=und, handler_name=Core Media Video, vendor_id=[0][0][0][0], encoder=HEVC |
| タグ (オーディオ) | language=und, handler_name=Core Media Audio, vendor_id=[0][0][0][0] | language=und, handler_name=Core Media Audio, vendor_id=[0][0][0][0] |
| サイドデータ (オーディオ) | Audio Service Type, service_type=0 | Audio Service Type, service_type=0 |
| 作成日時 | N/A | 2024-08-28T03:54:11.000000Z |
ファイル形式とエンコード情報らへんが怪しそうなので、
ffmpeg -i 再生できないファイル.mov -c:v hevc_videotoolbox -b:v <ビットレート> -profile:v main -tag:v hvc1 -map_metadata 0 -c:a copy output.mp4
でエンコード。
AVFoundationで試してみると、エラーは出なくなった。
ただし、hevc_videotoolboxはlibx265と比べてビットレートが同じ画質で約2倍必要という情報を見たので
下記コマンドでエンコード
ffmpeg -i 再生できないファイル.mov -c:v libx265 -b:v <ビットレート> -profile:v main -tag:v hvc1 -map_metadata 0 -c:a copy output.mp4
この動画でもエラーが出なくなった。
3. 結論
.movファイルでこのような問題が起きたときは
-c:v libx265
-profile:v main
-tag:v hvc1
.mp4
でエンコードしてみよう。
もしくは、上記の表に貼り付けた再生できるファイルとの差分を調べてみよう。
Discussion