🐈

Swift AVFoundation 12900エラーの対処

2024/08/28に公開

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で調べてみると、以下のページだけヒットした。
https://stackoverflow.com/questions/29525000/how-to-use-videotoolbox-to-decompress-h-264-video-stream

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倍必要という情報を見たので
https://blog.ch3cooh.jp/entry/2022/04/25/093000

下記コマンドでエンコード

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