砂漠の旅人(たびと)

UNIX / MS-DOS 時代から電脳砂漠を旅しています

【C#】YouTube からビデオとオーディオをダウンロードするアプリを作ってみる - その1

こんにちは、たびとです。

久しぶりに、C# でアプリを作ってみようと思い、何か欲しいアプリがないか、 周りにリクエストをしたところ、「YouTube 、もっと簡単にダウンロードしたい」 との要望がありました。

この手のサービスやアプリは多いので、今更作っても、どうかと思いましたが、 最近仕事でも AI アプリでビデオを扱っていたので、その知識も活かせるかもと、 単純な考えから、久しぶりに GUI アプリを作ることにしました。

今回は、お手軽 YouTube ダウンローダーを .NET 6 の WPF で作っていきたいと思います。 実際に完成したら、GitHub に登録する予定です。

この記事の対象者

  • YouTube からビデオをダウンロードすることに興味のある方
  • C#YouTube からビデオをダウンロードするアプリ開発に興味のある方
  • ビデオだけでなくオーディオのダウンロードにも興味のある方

YouTube からダウンロード

まずは、C#YouTube からダウンロードする方法を探します。 NuGet では VideoLibrary GitHub では omansak / libvideo というライブラリが見つかりました。

github.com

libvideo (VideoLibrary) のサンプル

以下、GitHub からの抜粋ですが、使い方は、とても簡単です。

using VideoLibrary;

void SaveVideoToDisk(string link)
{
    var youTube = YouTube.Default; // starting point for YouTube actions
    var video = youTube.GetVideo(link); // gets a Video object with info about the video
    File.WriteAllBytes(@"C:\" + video.FullName, video.GetBytes());
}

しかし、GUI でプログラムを作るとなると、ファイルサイズが大きくなると、 UI が固まってしまうので、非同期系のメソッドが欲しいところです。

GitHub の Documentation を開くと Advanced の項目に非同期系のメソッドも用意されていました。 これで、GUI で作る時も安心できそうです。

Advanced のメソッドを試してみる

Documentation を眺めていると、GetAllVideosAsync というメソッドがありました。 これって、YouTube のすべての情報が取得できるのではないかと思い試してみました。

var youTube = YouTube.Default; // starting point for YouTube actions
var videoInfos = youTube.GetAllVideosAsync(link).GetAwaiter().GetResult();

「米津玄師 - POP SONG」で試してみると、27項目がヒットしました。 この27項目の中は、 VideoLibrary.YouTubeVideo というクラスの中に、 映像と音声の情報があって、映像だけ・音声だけ・両方の 3パターンがありました。

VideoLibrary がサポートしているのは、 映像が MP4, WebM 、音声が AAC, Opus, Vorbis のようです。

このようにすべての情報が取得できると、ビデオとオーディオをそれぞれダウンロードしたくなります。 ビデオは MP4 でいいとして、オーディオは AAC と MP3 が欲しいところです。 しかし、MP3 はサポートされないため、AAC からコンバートするしかなさそうです。

AAC から MP3 への変換

YouTube から AAC を抽出できることが分かったので、次は AAC から MP3 へ変換する方法を探します。 最悪の場合、FFmpeg ラッパーを使う手があるのですが、 これは FFmpeg の実行モジュールも別途インストールする必要があるため、 今回のツールはお手軽系なので、回避したいと思います。

あれこれ探していると、NAudio というライブラリが見つかりました。

github.com

MP3変換との苦闘

NAudio ですが、とにかくドキュメントが難解です。 何でもできる系のライブラリって、こんな傾向にあるけど、 ドキュメントを読んでも「AAC から MP3 へ変換する方法」が検討もつきません。

しかし、単なるファイル変換に本腰を入れてドキュメントを読む気力もないので、 とにかくググって探して、サンプルアプリを作って動かして当たりを引くまで繰り返します。

途中、NAudio.Lame という NAudio の亜種も試してみるもダメでした。 とにかく、海外サイトを中心に怪しいものを次から次へと試しながら、 何とか AAC から MP3 の変換方法を見つけました。 (どこで見つけたのか、メモするのを忘れました)

var reader = new NAudio.Wave.MediaFoundationReader(aacPath);
var mediaType = NAudio.Wave.MediaFoundationEncoder.SelectMediaType(AudioSubtypes.MFAudioFormat_MP3, reader.WaveFormat, reader.WaveFormat.BitsPerSample);
using var encoder = new NAudio.Wave.MediaFoundationEncoder(mediaType);
encoder.Encode(mp3Path, reader);

こんなに AAC から MP3 の変換に苦労するとは思いませんでした。 ただし、この変換を行うと、AAC 128kbps から MP3 96kbps にダウングレードされるので、 まだまだ改善の余地はありそうです。 また、非同期系のメソッドはないようなので、処理が重ければ Task.Run() を使うしかなさそうです。

まとめ

今回は、お手軽 YouTube ダウンローダー の GUI アプリを作る第一歩として、 YouTube からダウンロードするためのライブラリ libvideo(VideoLibrary) を探しました。

libvideo(VideoLibrary) は、YouTube の 映像(MP3, WebM)と音声(AAC, Opus, Vorbis)を取得できるため、 音声も対象としてみようと思いましたが、MP3 がサポートされていないため、 AAC から MP3 に変換することにしました。 この変換ライブラリとして、 NAudio を探しました。

これで、車で言えばエンジンを手に入れたようなモノです。 これらのライブラリを軸に GUI アプリ開発を進めたいと思います。

最後に参考サイトを掲載しておきます。 では、皆さん、よい旅を。

次回以降のリンクはこちら。

sabakunotabito.hatenablog.com

sabakunotabito.hatenablog.com

sabakunotabito.hatenablog.com

sabakunotabito.hatenablog.com

参考サイト