Youtubeからダウンロードしたmkvをffmpegやshotcutで使えない件

昨今の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 -vcodec -libaom out.mp4

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も対応してないじゃん。

ドライバのインストール

そんな悲しい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を追加したくない場合は直接ダウンロードしてインストールしても構いません。

ドライバの更新をしたので一旦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-nvenc –enable-libaom –enable-gpl –enable-libx265 –enable-libfreetype –enable-libmp3lame

## コンパイルしてインストール

$ make
$ sudo make install

./configureのオプションは以下のとおりです

–disable-x86asm古いx86系CPUとの互換性を保つ必要が無いので無効にします。
–enable-nvencNVIDIAが使える時は使います。今回はH264飲み使えます。
–enable-libaomAV1形式のエンコード/デコードをサポートします
–enable-gpllivx265の前提です
–enable-libx265H.265(HEVC)形式のエンコード/デコードをサポートします
–enable-libfreetypefreeタイプのエンコード/デコードをサポートします。主にmp4ファイルが壊れていると時に使います。
–enable-libmp3lame音声(mp3)のエンコード/デコードでlameという評価の高いライブラリをサポートします。

2021/1時点ではubuntuにlib256.so.179が無いため–enable-libx265は外したほうが良いです。

ここまで出来たらOSをリブートします。

問題なければ

$ ffmpeg -i input.mkv -vcodec libx265 out.mp4

でファイル形式をmp4に変換してshotcutに読み込むことができるはずです。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です