2016年2月15日 に ffmpeg 3.0 Einstein(アインシュタイン)がリリースされた。今回のリリースはメジャーアップデートとなり、2.8 以降に追加された新機能の中からマスターにしか追加されていなかったフィルタやエンコーダ、デコーダ等の新機能が全て取り込まれた。
RELEASE NOTES for FFmpeg 3.0 “Einstein”
2.8 以降に取り込まれた機能の一覧
Changelog 2.8.1 to 3.0 < git.videolan.org Git
今回のアップデートの主な特徴
- ffplay の挙動変更
- MP4 の暗号化、復号対応
- DTS-HD を外部ライブラリに頼らずフルサポート
- DXVA2、VAAPI の VP9 ハードウェアデコード対応
- libaacplus と libvo-aacenc のサポート打ち切りと内蔵AACエンコーダの品質向上
- マスターにしか追加されていなかったフィルタの追加
- HLS のセキュリティ対策(2.8.5以降)
ffplay の挙動変更についてはffplay のショートカットキーに追記しているが、画面左クリックでシーン移動できていたのが右クリックに変わったのと、左マウスダブルクリックでフルスクリーンに変えられるようになっている。
MP4 の暗号化、復号対応についてはウェブサイトに設定方法が書いてなくffmpeg -h full
からオプションを調べると載っていて、encryption、decryption で検索する。
-encryption_schemeE....... Configures the encryption scheme, allowed values are none, cenc-aes-ctr -encryption_key E....... The media encryption key (hex) -encryption_kid E....... The media encryption key identifier (hex)
ffmpeg -f lavfi -i testsrc2=d=10 -c:v libx264 -encryption_scheme cenc-aes-ctr -encryption_key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 encrypted.mp4
ffmpeg -decryption_key 76a6c65c5ea762046bd749a2e632ccbb -i encrypted.mp4 -c copy decrypted.mp4
how can i decrypt the encrypted mp4 file using ffmpeg – Stack Overflow
libaacplusとlibvo-aacencのサポート打ち切りとKamedo2さんの多大な貢献で内蔵AACエンコーダの品質が向上した。それにより内蔵AACは libvo-aacenc の代わりとして、libaacplusは当初HE-AAC、HE-AACv2のエンコーダとして使われていたが(FDK-AAC)libfdk_aacの登場によりその役目を終えた。しかし内蔵AACは128k以下の高速エンコードでは libvo-aacenc の代わりになっていないと Kamedo2 さんが言及している。
Kamedo2 さんの記事:FFmpegから使えるAACエンコーダ の音質比較 – 音風景ブログ
@YSRKEN FFmpeg内蔵AAC使え、と書いてあります。バイナリ配布可能な形で128k以下の高速エンコードを志向する場合はvoが有利でしょうから、外すのは時期尚早な感。
— 音風景の管理人 (@kamedo2) January 30, 2016
マスターにしか追加されていなかったフィルタの追加については適宜このブログでも更新していたが、更新予定のフィルタもあるので随時更新予定。
追加されたフィルタで記事にしているフィルタ。
- Zライブラリを使ったリサイズフィルタ zscale
- RGB, CMYK を個別に調整できる selectivecolor
- サンプリング周波数を変えずにテンポとピッチを変える rubberband
- マスクして2入力を合わせる maskedmerge
- ffmpeg でクロマキー合成 その2
HLS のセキュリティ対策(2.8.5以降)についてはffmpeg 2.8.5 リリースで言及しそれ以降も数回更新が有り HLS のマニフェストファイルの読み込み制限がきつくなった。既定値のプロトコル以外を読み込むには別途-protocol_whitelist
で指定する。ローカルファイルを読み込むfile
は既定値に含まれないので既定値のプロトコルを含めて追記する。全てを許可する場合は。いつの間にか使えなくなっていたので個別に指定する。ブラックリストは対象プロトコルの前にALL
-
をつける。
既定値:file,crypto
その後入力ファイル制限も強くなっているのでファイルタイプの解除もローカルの HLS の場合には必要になる。
ローカルに保存した HLS のマニフェストファイルから保存する場合のコマンド例。この場合、マニフェストファイルに記載してあるセグメントファイルは絶対パスになっている必要がある。そして最後に行に#EXT-X-ENDLISTを追加する。キーファイルが必要な場合はキーファイルも保存する。
ffmpeg -protocol_whitelist http,https,tls,tcp,crypto,file -allowed_extensions ALL -analyzeduration 30M -probesize 30M -i master.m3u8 -c copy output.ts
ffmpeg -protocol_whitelist http,https,tls,tcp,crypto,file -allowed_extensions ALL -analyzeduration 30M -probesize 30M -i master.m3u8 -c copy -bsf:a aac_adtstoasc output.mp4
突然のコメントすみません。
OpenCVのVideoCaptureで、sdpファイルを読み込もうとした結果、
[rtp @ 0x120c8c780] Protocol not on whitelist ‘file,crypto’!
というエラーが出てきました。
調べてみると上記の通り、ffmpegのデフォルトのwhite_listにudp,rtpのプロトコルが設定されていないとのことでした。
デフォルトのwhite_listに直接プロトコルを追加することは可能でしょうか?
よろしければアドバイスお願いします。
ffmpeg のコマンドラインではなくて、ライブラリなどで使う方法は全く詳しくありませんが、
オプション設定をせずにデフォルトのwhite_listに直接プロトコルを追加するにはソースコードを書き換えるしかないのではないでしょうか。
該当プロトコルのソースコードは以下を参照してみてください。
https://github.com/FFmpeg/FFmpeg/search?utf8=%E2%9C%93&q=default_whitelist+&type=