昨今のYoutubeはav1形式やvp9形式でコンバートしているので、ffmpegでmkv→mp4に変換してもshotcutでは扱えなかったりします。
というか、ffprobeでファイルの状態を見ると"AV1なんてエンコード知らないよ"と怒られます。
なので今回はyoutubeでダウンロードした動画ファイルをshotcutで使えるようにする手順です。
今までのやり方
$ ffmpeg -i input.mkv -vcodec copy out.mp4
ffmpeg 3.xではこのやり方で問題ありませんでした。
しかし最近のYoutubeはmkvのエンコードフォーマットがAV1なので、作成されるout.mp4もAV1形式のままです。
そしてffmpegはAV1形式を正しく読み込むことができません。Shotcutは内部的にffmpegをつかっているので当然正しく読み込むことができません。
...という循環にハマってしまいます。
これからのやり方
一時はH.265(別名 HEVC)がもてはやされていましたが特許料が高額になるため今後はオープンフォーマットであるAV1が主流になるでしょう。
なので、ffmpegをコンパイルし直してAV1に対応できるようにしましょう。
$ ffmpeg -i input.mkv out.mp4
諸々準備
デコーダーをインストールする
ffmpegでAV1をコード/デコードするにはデコーダが必要です。libaomが有名ですが動作が遅かったり品質が悪かったりといろいろ課題がありました。そこで今回はlibaomに加えSVT-AV1をインストールします。
livaomはaptパッケージがあるのですがSVT-AV1はソースからコンパイルします。コンパイルにはアセンブラが必要なのでnasmもインストールします。
$ sudo apt install libaom-dev nasm
$ git clone --depth=1 https://gitlab.com/AOMediaCodec/SVT-AV1.git
$ cd SVT-AV1/Build
$ cmake
$ make
$ sudo make install
GPUの準備
そもそもGPUを使えるのか
グラフィックボードを持っている場合は使いたくなるのが心情。
ただ、残念なことにNVIDIA製のグラフィックボードはAV1のデコードはできますがエンコードはできない様です。つまり、ダウンロードしたmkvファイル(AV1)をh265に変換して出力することはできますが、逆はできません。
なのでAV1形式で出力したい場合はCPUを使うしかありません。
NVIDIA系のGPUでエンコード/デコードできる形式はVideo Encode and Decode GPU Support Matrixを参照。
ちなみに私の場合はGeForce GT730なので上記サイトには情報がありません。Wikipedia先生によると2013年4月時点でPureVideo HDのVP5という世代の基盤で、VDPAU features setのDレベルの機能があるらしい。
要するにMPEG1,2,4形式に対応しており、3D Blue-rayをサポートしており、H.264のデコードをサポートしていますよとのこと。
あちゃー H.265もAV1も対応してないじゃん。
というわけでH.265やAV1を使うときはCPUでエンコード/デコードします
ドライバのインストール
GT 730はH.264のデコードだけは使えるらしいのでドライバをインストールしておきます。
$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GK208B [GeForce GT 730] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GK208 HDMI/DP Audio Controller (rev a1)
## NVIDIAのドライバを更新
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt list --upgradable
## 最適なドライバを調べる
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001287sv000010DEsd00001081bc03sc00i00
vendor : NVIDIA Corporation
model : GK208B [GeForce GT 730]
driver : nvidia-driver-390 - distro non-free
driver : nvidia-driver-455 - third-party free recommended
driver : nvidia-driver-440-server - distro non-free
driver : nvidia-driver-418-server - distro non-free
driver : nvidia-340 - distro non-free
driver : nvidia-driver-450-server - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin
## 最新のドライバをインストール
$ sudo apt install nvidia-driver-455
ドライバはNVIDIAのサイトで検索することもできます。add-apt-repositoryで余計なPPAを追加したくない場合は直接ダウンロードしてインストールしても構いません。
追記 この操作はsudo apt install libffmpeg-nvenc-devに置き換えられました。
ドライバの更新をしたので一旦Ubuntuを再起動しておきましょう。
FFmpegの再コンパイル
現在のバージョンを確認しておく
地味ですが大事です。これをやっておかないとちゃんとバージョンが上がっているのか確認できません。また、前回コンパイルした時のオプションも確認しておきます。
$ ffmpeg -version
ffmpeg version N-95881-g59d264b0a1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9 (Ubuntu 9.2.1-9ubuntu2)
configuration: --disable-x86asm --enable-nvenc --enable-libmp3lame
libavutil 56. 36.100 / 56. 36.100
libavcodec 58. 62.100 / 58. 62.100
libavformat 58. 35.100 / 58. 35.100
libavdevice 58. 9.101 / 58. 9.101
libavfilter 7. 67.100 / 7. 67.100
libswscale 5. 6.100 / 5. 6.100
libswresample 3. 6.100 / 3. 6.100
グラフィックスボードのヘッダーをインストールする
とってもC言語な話になりますが、このあとffmpegをコンパイルする際に"NVIDIAのグラフィックボードを使えるようにしてね!"というオプションを付けます。
ffmpegのコンパイルをする際にグラフィックスボードの詳細な情報をコンパイラに教えてあげる必要があります。この情報がヘッダーと呼ばれるものです。
ヘッダーはffmepgのWebサイトに置いてあるので先にダウンロードしてインストールしておきましょう。
$ mkdir compile ; cd compile
$ git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers
$ cd nv-codec-headers
$ sudo make install
$ cd ..
ffmpegのソースコードをダウンロードしてコンパイルする
いよいよソースコードを使ってコンパイルします。とは言っても一般的なUNIXのお作法にしたがい、./configureで設定ファイルを作ってmake ; make installでコンパイルとインストールをするだけです。
## ソースコードをダウンロード
$ git clone https://git.ffmpeg.org/ffmpeg.git
$ cd ffmpeg
## コンパイルオプションを指定して./configure
$ sudo apt install libaom-dev libx265-dev$ ./configure --disable-x86asm --enable-libaom --enable-libsvtav1 --enable-gpl --enable-libx265 --enable-libfreetype --enable-libmp3lame
## コンパイルしてインストール
$ make$ sudo make install
./configureのオプションは以下のとおりです
--disable-x86asm | 古いx86系CPUとの互換性を保つ必要が無いので無効にします。 |
--enable-libaom | AV1形式のエンコード/デコードをサポートします(aom) |
--enable-libsvtav1 | AV1形式のエンコード/デコードをサポートします(SVT-AV1) |
--enable-gpl | livx265の前提です |
--enable-libx265 | H.265(HEVC)形式のエンコード/デコードをサポートします。CPUを使います |
--enable-libfreetype | freeタイプのエンコード/デコードをサポートします。主にmp4ファイルが壊れている時に使います。 |
--enable-libmp3lame | 音声(mp3)のエンコード/デコードで評価の高いlameというライブラリをサポートします。 |
2021/1時点ではubuntuにlib256.so.179が無いため--enable-libx265は外したほうが良いです。
ここまで出来たらOSをリブートします。
問題なければ
$ ffmpeg -i input.mkv out.mp4
でファイル形式をmp4に変換してshotcutに読み込むことができるはずです。