・今後アップロードする動画はH.265コーデックでエンコードします。
→やっぱちょっと影響でかそうだったら辞めるかも、見れるかどうか、どっちが良いかについて以下でアンケート取っていますので良かったら回答お願いします。
まず現状の動画は全てH.264でエンコードされていますが、最近の動画は2分から3分と初期の頃より長くなっており4K60FPSの動画をFanboxの制限である300MBに抑えるにはビットレートがかなりカツカツの状況となっております。
例として品質をある程度一定化(VMAF90前後)してコーデックを変えてエンコードした結果以下のようになりました。
H.264(CPU): 171MB (libx264 -crf 26) 平均8Mbps
H.265(CPU): 63MB (libx265 -crf 29 -preset slow) 平均2.7Mbps
H.265のCPUエンコードではかなり平均ビットレートが抑えられ、ファイルサイズも非常に小さくなっています。
後述するように最近はブラウザ・標準ソフトでのサポートが増えているためファイルサイズと画質の関係上今後はH.265でエンコードするようにします。
PC/iOS/Androidにおいて主要なブラウザはほとんどがH.265に対応しており(一部HW依存らしいけど)HTMLのVideoタグでのストリーミング再生をサポートしています。
ついでにiOSでは音声ストリームの切り替えも可能です。
以下動画が再生できればその端末でH.265のストリーミング再生がサポートされています。(オーディオはストリーム1も2も一緒です。)
上記動画が再生できない場合、ダウンロードし特定のソフトウェアで再生することも可能です。
PC
H.265でエンコードされた動画は、Windows11 22H2以降であればデコーダが標準搭載され、メディアプレイヤーで再生可能となっております。
Windows 10のEOLが2025年10月と半年を切っており、Windows11への移行も進んでいるためここらで切り替えても問題ないと判断しました。
(ちなみにWindows11は𝑲𝑨𝑺𝑼です。コンパネから全然機能移せてないくせにコンパネへのアクセスを劣悪にするな)
上記動画をダウンロードし、再生可能であれば再生できます()
なお、22H2以前の環境であってもMicrosoft Storeで販売中の拡張コーデック(https://apps.microsoft.com/detail/9nmzlz57r3t7?hl=ja-JP&gl=JP)を購入するか、コーデック内蔵型のソフトウェア(VLC Media Player等)を使用すれば再生可能です。
スマホ
PCと同様にVLC Media Player等のコーデック内蔵型アプリを用いることで再生可能です。
先日「スマホで見たら音声が二重に聞こえる」との問い合わせがありました。
まさか~と思ってストリーミング再生してみるとそうっぽく聴こえます。
試しにわざと音声をずらした動画をエンコードしてスマホでストリーミング再生してみると確かに音声ストリーム1と2両方が同時に再生されていました。
最近の動画では「声のある音声」と「声のない音声」をそれぞれ2つの音声ストリームに書き込んで、メディアプレイヤーで切り替えることが出来るようにしています。
この音声ストリームが複数あるmp4をvideoタグでストリーミング再生する際にiOS/Androidではdisposition defaultが付いているストリームを全て再生するとかなんとか・・(他にもalternate-group IDがどうとかなんとからしいけど詳細は不明)
※実際の仕様書等読み漁ったわけではなくchatGPT(o3)に色々調べさせてたどり着いたものなので深くは突っ込んでいない
Adobe Premiereで中間コーデック出力したファイルや、Shutter Encoderで最終出力したファイルでは以下のようにストリーム両方にdisposition defaultが付いていますので、このうちストリーム1のみにdisposition defaultを付け、ストリーム2からは外す必要があります。
では上記設定をして万事解決・・・と思ったところ別問題が発生、動画ファイルによってWindows標準搭載のメディアプレイヤーでは1番目のストリームが選択されたり2番目が選択されたりする謎の事象に当たりました。
disposition defaultの設定や言語設定がOSと一致しているか等関係なく発生し、色々調べたり検証したところこれは「音声ストリームの平均ビットレートが高い方を最初に選ぶ」という動作になっている・・・っぽい
初期でストリーム2が選ばれる動画ファイル↓
初期でストリーム1が選ばれる動画ファイル↓
他にもAlternative-IDだのOS言語との一致だのあるようですが、別途MP4BOXを使用する必要があるなど面倒っぽいのでビットレートに差をつけてエンコードすることにしました。
というわけでやること↓
■disposition defaultの設定
■音声ストリーム1の平均ビットレートを一番高くする。
disposition設定もストリーム毎にビットレート分けることもShutter EncoderのGUIでは出来ない(一応ffmpegを直叩きは出来る)ため最終出力する際にffmpegを直接叩くことにしました。
ドキュメント読んだりchatGPTにシバいてもらって最終的に以下のように
ffmpeg -hide_banner -i "E:\in.mov" `
-map v:0 -map a:0 -map a:1 `
-c:v libx265 -crf 27 -preset slow `
-profile:v main -tag:v hvc1 -pix_fmt yuv420p `
-c:a:0 aac -b:a:0 160k -ar:a:0 48000 -disposition:a:0 default `
-c:a:1 aac -b:a:1 128k -ar:a:1 48000 -disposition:a:1 0 `
-movflags +faststart `
-metadata:s:a:0 language=jpn -metadata:s:a:1 language=jpn `
-metadata:s:a:0 title="voice" -metadata:s:a:1 title="no voice" `
-y "E:\out.mp4"
H.265 CRF値24でCPUエンコード、音楽ほど複雑な音でもないので声有りで160kbps声無しで128kbpsにし、前者にdisposition defaultを付与し後者から外します。
これで無事スマホもメディアプレイヤーもストリーム1が優先されるようになりました。
しかもiOSでは音声ストリームが別々に認識されるようになったためストリーミング再生でも切り替えれるようになりました。偉いね~
次回はWindowsでffmpeg動かしたり、VMAF動かしたりしたことについてまとめてみます。