Linuxのサウンドとビデオ

このテキストについて

このテキストは次の授業で使用されている標準化された教材です。

実際の授業では解説が加わる上に、生徒様に合わせて教材は制作・調整されるため、 このテキストよって得られる理解がMimir Yokohamaの授業のすべてではないことを予めご理解ください。

ビデオ

ビデオカードとドライバ

Linuxにおけるビデオカードの問題は複雑でハードルが高いものです。

これはグラフィックスの仕組みが複雑であることもありますが、メーカーサポートが薄く、開発が追いついていない実情もあります。

Waylandはこれらの問題を緩和する可能性が指摘されていますが、Waylandが普及するかどうかは不透明です。

Intel

Intelは昔であればマザーボードに、現在はCPUにグラフィックス機能を内蔵しています。 高性能なものではありませんが、Skylake以降のCPUに内蔵されたグラフィックスは不自由ない程度には動作するでしょう。

IntelはLinux向けにオープンソースドライバの提供とサポートを行っており、非常に安定していて、かつ特別苦労することなく動作させることができます。

このため、Intel製グラフィックスを採用するコンピュータではビデオドライバの選択がある場合にはフリードライバを選択するのが正しいと言えます。

標準的なシステム1においては最も安定しており、無理にNvidiaやAMD製の高性能ビデオカードを搭載するよりもよい結果が得られる可能性があります。

Intelドライバはかなり細かにチューニングが可能ができます。詳細はArchwikiを見るとよいでしょう。

Nvidia

Nvidiaは古くからLinuxシステム向けにクローズドなプロプライエタリドライバの提供を行ってきました。 そのためNvidiaのビデオ環境は動作する可能性が高く、またLinuxシステムとしては最も高いビデオ性能を発揮することができますが、一方でWindowsと比べると重大な差異や欠点があります。

Nvidia製ビデオカードを使用する場合はnvidiaドライバとNouveauドライバの2つが選択肢としてあります2。 前者はNvidiaが提供するクローズドなプロプライエタリドライバ(non-free)で、後者はX.orgで開発されているオープンソースドライバ(free)です。

ビデオカードの動作可能性及び性能ではnvidiaに軍配があがります。 機能的にもnvidiaが優れています。

伝統的にnvidiaドライバーの導入、アップデートはそれなりに難しい手順を踏む必要がありますが3、Arch LinuxではPacmanを用いてカーネルと一緒にアップデートすることが可能です。 カスタムカーネル利用者のためにカーネルアップデート時に自動でビルドを行うdkmsパッケージも容易されています。 さらに、Manjaroではmhwdツールの一部としてビデオドライバが提供されており、ビデオカードとドライバを選択すればあとは日々アップデートするだけで意識することなく扱うことができます。

Nvidiaビデオカードを使う上で留意すべき重要な点が2つあります。

ひとつは、Windowsのドライバと比べて性能が非常に低いことです。 FreeBSD用ドライバはWindowsに匹敵する性能があるため、Linux用ドライバはNvidiaが提供するものであるにも関わらず極端に性能が低い、ということになります。

もうひとつは、Nvidiaが「複数のビデオカードを使って3画面以上を出力することはできない」としていることです。 これは同一のカードを2枚使って行うBase Mosaicを使ってすらこのような制限がおかれています。 Nvidiaは「Windowsドライバーと同じ」と説明していますが、実際のところWindowsにこのような制限はなく、ほとんどの場合挿せば自動的に接続可能な数だけ画面を出力することができ、重大な差異になっています。 Quadroクラスの同一カードをSLI接続して用いるSLI Mosaicを使えば複数カードでの3画面以上出力が可能ですが、かなり厳しい制約です。

Xの多画面機能であるXineramaが使用できない、とされていますが、実際のところ機能自体は残されているようです。 ただし、とても実用的とは言えない速度で動作します。 現状では画面数を増やすためにNvidiaビデオカードを増設することは賢い選択とは言えません。

なお、Nouveauドライバを使用した場合は動作はするものの、一部動作がおかしくなります。 WaylandにおいてNouveauドライバを使用する場合は何も問題はないようです。 Nouveauのドキュメントのこの1行は非常に心強いものでしょう。

It has been confirmed by a number of people that multicard setup (two cards driving three or four monitors) works fine with nouveau. The following is a simplified example that with a few minor edit should just should work

なお、昔はNvidiaのドライバーは標準でカーネルに含まれておらず、またプロプライエタリドライバが同梱されていることもないというものが普通でした。 このため、古いNvidiaビデオカードを搭載したコンピュータを古いLinuxディストリビューションで起動しようとすると画面が表示されないというトラブルが生じます。 また、最新のnvidiaドライバを搭載したディストリビューションの場合も、既にサポート切れとなっており表示できません。 新しいnouveauドライバを搭載したディストリビューションであれば表示することができます。

AMD

LinuxとAMD(ATI)ビデオカードとの関係は少々複雑です。

元々Nvidiaと比べてサポートの薄かったATI/AMDのLinuxに対するビデオサポートですが、近年Linuxにも力を入れてきています。 しかしながら、元々の性能がNvidiaに劣るだけでなく、ドライバの性能も安定性も劣っていたため、Linuxにおいてあまり優れた選択肢ではありませんでした。

しかしその状況は、AMDがLinuxに対するサポートを続ける中で改善されつつあります。

LinuxにおいてAMDビデオカードのドライバは次の5つがあります。

AMD Catalyst(以前のfglrx)がAMDが提供するクローズドなプロプライエタリドライバです。

AMDの場合、Nvidiaと比べオープンソースドライバとプロプライエタリドライバの性能差があまり大きくありません。 とはいえ、Catalystが最も性能を発揮できるのは事実です。 しかし、一方でCatalystドライバは不具合が非常に多く、あまり安定した動作が期待できません。

Arch LinuxではCatalystドライバはサポート外となっています。 これは開発が間に合っておらず、ドライバの質も低く、問題を多く生じてきた歴史を鑑みてのことです。 Manjaroではコミュニティパッケージとしてmhwdの機能に組み込まれています。 Catalystドライバをサポート外とする選択をしているディストリビューションは、nvidiaドライバを選択できるディストリビューションの中では少数派でしょう。

ATIドライバとRadeonドライバは現在は統合されています。Arch Linuxの場合パッケージ名はxf86-video-atiです。

AMDGPUドライバは2015年11月に公開された新しいオープンソースのドライバです。パッケージ名はxf86-video-amdgpuです。 登場よりも新しいビデオカードのみをサポートしますが、良好な性能と安定性を発揮しています。

AMDGPUドライバはAMDによるCatalystドライバの一部オープンソース化によって実現したものです。 これにより、Catalystに搭載されている機能や性能が取り込まれています。

AMDGPU PROドライバはAMDGPUドライバにプロプライエタリなコードを組み込んだクローズドなドライバです。 Catalystにかわる新しいドライバとして期待されましたが、現在OUT OF DATEとなっています。

現在のところ、(計測条件によっても異なりますが)AMDGPUはCatalystに匹敵する性能を発揮しながら、安定しており、さらにマルチディスプレイサポートなども優れています。 AMDがLinuxを尊重する姿勢を続ける限り、今後はCatalystドライバは廃止に近づき、AMDGPUドライバが主流となっていくでしょう。

ハードウェアビデオアクセラレーションはNvidiaのほうが幅広く、優れています。

ビデオアクセラレーション

Linuxにおいてもビデオエンコード/デコードのハードウェアアクセラレーションは利用可能です。

VA-API

VA-APIはハードウェアアクセラレーションを利用したエンコード・デコードを実現するオープンソースライブラリです。 Intelによって開発されました。

インストールと設定についてはArchwikiを参考にしてください。

VDPAU

VDPAUはビデオカードに動画のデコードやポストプロセス処理をオフロードするオープンソースライブラリです。 Nvidiaによって開発されました。

インストールと設定についてはArchwikiを参考にしてください。

XvMC

XvMCは動画のデコード処理をビデオカードにオフロードできるX.Orgの拡張です。

XvMCは性能的にもVDPAU/VA-APIに劣るため、置き換えが進んでいます。

オープンソースドライバにおいては設定せずとも自動的に有効になります。 プロプライエタリドライバにおいては、nvidiaでは/etc/X11/XvMCConfigとして

libXvMCNVIDIA_dynamic.so.1

Catalystでは

libAMDXvBA.so.1

とします。

XvMCによるデコードアクセラレーションはVLC及びSMPlayerが対応しています。

また、MPlayerにおいて-voオプションとしてxvmcを指定することもできます。

日本における法的な問題

日本では私的複製を含む暗号化された映像データの複製が禁止されています。 これは世界的に見ても類を見ない法律です4

これにより、日本ではlibdvdcssを筆頭としていくつかのコーデック及びライブラリが 「配布が違法なもの」とされます。 このために、同ソフトウェアの配布はおろか、 そのような機能をもつメディアプレイヤーや、それらを含むLinuxディストリビューションのホスティングも禁止されることになります。

フレームワーク

FFmpeg

FFmpegはマルチメディアのエンコード・デコードを行うマルチメディアフレームワークです。

主にFFmpegアプリケーションで使われますが、mpvなどFFmpegを利用してデコードを行うプレイヤーがあります。 また、映像制作ソフトウェアはFFmpegを利用するソフトウェアが多くあります。

GStreamer

GStreamerはFreedesktopによって開発されているマルチメディアフレームワークです。

Gnomeが最も積極的に活用していますが、Gnomeプロジェクトの一部というわけではなく、KDEコンポーネントにおいても使用されています。

GStreamerは次のように分類されています。

Archパッケージ 内容
gst-libav FFmpegから分裂したlibavcodecをベースとした多数のエンコーダとデコーダ
gst-plugins-bad 品質テストやドキュメントが不足しているもの
gst-plugins-base 重要で基本的なもの
gst-plugins-good LGPLで配布されている品質的にもライセンス的にも問題のないもの
gst-plugins-ugly ライセンスなど配布に関して支障のあるもの
gst-plugin-libde265 H.265用のオープンな動画コーデック

また、VA-APIサポートはgstreamer-vaapiに、VDPAUサポートはgst-plugins-badに含まれています。

libdvdcss

暗号化されたDVDの復号化を行うためのソフトウェアです。 これによりDVDの視聴が可能になります。

日本では次のような法的な問題があります。

アプリケーション

再生

MPlayer

MPlayerはFFmpegを内包し、再生機能をすべて自前で持っています。

非常に巨大なソフトウェアです。

MPlyaerはVDPAUをサポートし、VA-APIは標準ではサポートしていません。 VDPAUを使うには-voオプションでvdpauを指定します(VDPAUが有効である必要があります)。

MPlayerはGUIを持たないシンプルな動画プレイヤーです。 GUIバージョンとしてgmplayerというコマンドが用意されていますが、Arch Linuxのパッケージではgmplayerが含まれていません。 Arch LinuxではMPlayerのGUIが必要な場合はSMPlayerを使うよう求められています。

mpv

mpvはMPlayerからforkしたMPlyer2の後継です。 サポート形式の強化、

mpvはVDPAU及びVA-APIをサポートしています。 --hwdec=<api>形式を取ります。また、これに併せて--vo=<out>オプションも追加してください。。

mpvにはgmplayerのようなGUIがありませんが、かわりにon screen controllerがあり、動画上にマウスカーソルを移動することでコントローラが表示されます。

SMPlayer

SMPlayerはMPlayer用のQtベースのGUIフロントエンドです。 MPlayerに様々なGUI機能を追加することができます。

バックエンドとしてmpvも利用可能です。

VLC Media Player

VLCは非常に強力なマルチメディアプレイヤーです。 MPlayerと比べてもLinuxらしい癖がなく、Windowsでも多用され、Androidバージョンもあります。

また、libdvdcssを用いたDVDビデオ再生にも対応しています。

VLCには多彩な高度な機能があり、VDPAU/VA-APIにも対応しています。 これは出力設定によって利用することができます。

コーデックとしてFFmpegのライブラリを使用しています。

制作

Kdenlive

KdenliveはKDEコンポーネントを利用したノンリニアビデオエディタです。 Linuxでは4k映像の編集にいち早く対応しました。

高機能ですが、重く、不安定であることが指摘されています。

Openshot

Openshotはマルチプラットフォームのノンリニアビデオエディタです。

シンプルな操作で扱いやすいよう設計されています。 そのため機能は限定的です。 Windows Live ムービーメーカーに近いという意見もあります。

動作は非常に不安定であるように感じられました。

Shotcut

Shtocutはノンリニアビデオエディタです。 他のエディタと比べ安定性が高いのが特徴です。

Kdenliveと比べると利用できる機能は限定的ですが、基本的な機能は揃っており、 それなりに高機能なエディタとなります。

ビデオの加工にHTML5が利用できるという特徴があります。

FLowblade

Flowblade Video Editorは堅牢性を求めたノンリニアビデオエディタです。

日本語の情報はほとんどありません。

Cinelerra

Cinelerraはプロフェッショナル指向のノンリニアビデオエディタです。 マルチプラットフォームであるため、Windowsで使用している人もいるようです。

CinelerraはHeroine Virtualからリリースされたものですが、GPL下でのリリースとはなっているものの、 そのコードベースの合法性に疑義が生じています。 これをベースに改善が施されたものがコミュニティバージョン(CV)です。

Manjaroにはcinelerra-cvがcommunityパッケージとなっており、 AURにはcinelerra-heroineがありますが(HVとされることもあります)、これはOut of Dateが立てられています。

CinelerraはLinuxで最高のエディタとも呼ばれていますが、見た目は最悪だという指摘もあります。 また、安定性もLinuxのビデオエディタにありがちなレベルにとどまるようです。

Avidemux

Avidemuxはシンプルな切り取り、エンコード、フィルタリングなどを行うためのビデオエディタです。

主にはFFmpegでのパラメータ指定ができない人がエンコードに使っていますが、簡単なビデオ編集も可能です。

サウンド

サウンドシステム

Linuxのサウンドまわりは非常に複雑です。 統一的な音声再生方法は用意されておらず、様々なコンポーネントを組み合わせて音を出します。

その中でALSAは最も基本的な存在であり、ALSAコンポーネントにハードウェアドライバも含まれています。

複雑なLinuxのサウンドシステムの利便性を高めてくれるのがPulseAudioです。

OSS

OSS(Open Sound System)はカーネルモジュールとして動作するUnix OSにおける標準的なサウンドインターフェイスです。

OSSはサウンドカードのドライバを含んでいます。 OSSは基本的なUnixデバイスに基づいた操作を可能にし、write(2), read(2), ioctl(2)などによって 操作することができます。

つまり、OSSデバイスに対してPCM音源をwriteすれば音声を再生することができるわけです。

OSSを利用することにより、ハードウェアの差異を吸収することができます。

OSSはLinuxにとってはレガシーなソフトウェアです。 古いサウンドデバイスであればALSAより優れているかもしれませんが、 それ以外の多くの場合はALSAに劣ります。 特にUSBオーディオへの出力は非常に限定的で、USBオーディオからの入力は受け付けません。 また、MIDIデバイスはTiMidity+やFluidSynthなどのソフトウェアMIDIデバイスしか扱うことができません。

OSSはソフトウェアミキサーを含んでおり、複数のアプリケーションから鳴らされた音を合成したり、 デバイスごとのボリュームコントロールを行ったりすることができます。

ALSA

ALSA(Advanced Linux Sound Architecture)はOSSを置き換える目的で開発されたLinuxカーネルコンポーネントです。

ALSAの重要な部分はサウンドデバイスのドライバーです。 Linuxがオーディオデバイスを取り扱うとき、ほとんどの場合はALSAのドライバーによって動作することになります。

また、ハードウェアMIDIデバイスに対応するほか、マルチチャンネルミキシングハードウェアも扱うことができます。 また、マルチプロセッサにも対応し、高音質な音源の再生にも対応します。 USBオーディオデバイスにも対応し、マルチチャンネルかつ録音装置も備えたUSBオーディオインターフェースも扱うことができます。

ALSAはこのほかミキサー機能、オーディオデバイスごとのボリュームコントロール(alsamixer)、ユーザーライブラリなどを提供します。 aplayコマンドはPCM音源をALSAで再生するための機能です。 さらにAlsaEqualイコライザなども存在します。

ALSAはOSSよりも多くの高度な機能を持ち、その分巨大で複雑なAPIを持っています。 そのため、ALSAを使ったアプリケーションの開発はOSSを使ったアプリケーションの開発よりも困難です。 しかし、ALSAはOSSのエミュレーションレイヤーがあり、これまでOSS向けに書かれたアプリケーションがALSAを利用できるだけでなく、 OSS向けに書くことでBSDやSolarisなど他のUnixプラットフォームでも音声再生が可能なプログラムが作れます。

ALSAのAPIは複雑であり、また制御も困難です。 そのため、現在はサウンドサーバを介してそのバックエンドとしてALSAを使う形態が多くなっています。 しかし、ハイレゾ音源を再生する場合はレイヤーを少なくする、遅延を減らす、負荷を減らす、リサンプリングを回避するなどの目的で直接のALSAでの再生が行われる場合もあります。

しかし、ALSA自身、ソフトウェアミキサーが有効である場合、リサンプリングを行います。 このため、高音質音源を再生しても高音質で再生されることはありません。 さらに、デフォルトでリサンプリングにはdmixを使用しており、その品質はよくありません。

ソフトウェアミキサーは、ハードウェアミキサーを持たないオーディオデバイスにおいて自動的に有効化されます。 そうでなければ複数のアプリケーションが同時発声することができないためです。 ただし、PulseAudioを使用している場合はこのリサンプリングは行われません。

FFADO

FireWireオーディオデバイスを扱うためのライブラリであり、同時に同ハードウェア向けドライバーのカーネルモジュールも提供しています。 Echo社, Focusrite社とは協力関係にあり、これらのメーカーによるFireWireオーディオデバイスは安定してFFADOによってLinuxで扱うことができます。

FFADOは24bit/192kHzのサンプリング, MIDI, SPDIF, ADAT/SMUX, ワードクロック切り替えなどに対応しています。

SDL

SDLはクロスプラットフォームのマルチメディアライブラリです。 サウンドだけでなくグラフィック描画用APIも提供します。

主にグラフィックス描画やサウンド再生のクロスプラットフォーム化を実現するための薄いレイヤーですが、 クロスプラットフォームなプログラムを書くことを容易にします。

Perl, Python, Rubyなどのスクリプト言語にもインターフェイスが移植されており、主にゲームで使われています。

OpenAL

OpenALはクロスプラットフォームのオーディオAPIです。

OpenGLと似たコードによってオーディオの再生を制御することができます。 元々はLoki Software5が商用のWindows用ゲームをLinuxへと移植しやすくするために作ったものです。

OpenGLはかなり原始的で細かな制御が可能なAPIを提供しますが、 そこまで低レベルの制御が不要な場合のために様々な便利機能をもった(OpenGLのGLUTライブラリのような)ALUTライブラリが提供されています。

OpenALの記述は主には「三次元空間を感じさせる音源の発声」であり、FPS/TPSのような音源と自分との位置関係を感じさせる発音を求めるゲームSEによってよく利用されます。

esd(EsounD)

esd(Enlightended Sound Daemon)はEnlightenmentで採用されていたサウンドサーバです。 Gnomeでも利用されていました。

ESDはサウンドミキサーです。 様々な様々なプログラムの鳴らした音を混ぜてサウンドカードへのストリームを出力します。

また、ネットワーク透過機能があり、ESDアプリケーションはネットワークを通じてリモートホスト上のESDサーバーに音声出力を行い、リモートホスト上のESDサーバーが同ホストのサウンドカードに音声ストリームを流す、ということが可能です。

ESDは独自のAPIを持ち、一般的なサウンドハードウェアのAPIをエミュレートしません。 そのため、ESD対応アプリケーションはESD用のコードを書かなければなりません。

そのかわり、ハードウェアに依存せず音を鳴らすコードを書くことができます。

aRtsd

KDE3で採用されていたサウンドサーバです。 KDEからは独立したソフトウェアになります。

また、aRtsdはアナログシンセサイザーエミュレータでもあり、 シーケンサやシンセサイザーなどをaRtsdに接続してレイアウトすることが可能です。

Jackに競合する存在であり、ミキサーとしての機能に限ればESDとも競合していました。

Phonon

PhononはKDE 4から採用されたクロスプラットフォームのマルチメディアAPIです。

Phonon自体は音を鳴らす機能がありません。 PhononはXine, GStreamer, VLCなどのマルチメディアフレームワークをバックエンドとし、 いかにして音を鳴らすかについてはそれらに委ねます。

Phononが占める重要な役割は主に2つです。

ひとつは、「アプリケーションがPhononで音を鳴らす」という選択肢を与えることです。 アプリケーションが様々な(不安定な)フレームワークに依存することで、統一的に扱えなくなったり、 また特定のフレームワークが保守されなくなったりする問題を回避します。

さらに、アプリケーションはPhononを使うことで非常に簡潔に音声を鳴らすコードを記述することができます。 例えば次のようなC++コードによってです。

もうひとつはミキサーとして機能することです。 Phononはどのアプリケーションのサウンドをどのサウンドカードに出力するかという制御が可能です。 これにより、ヘッドセットを用いて通話をしながら他のスピーカーから音楽を流す、といったことが可能です。

現在、Phononのミキサー機能は多くの場合PulseAudioとの統合によって実現しています。

Jack

Jack(Jack Audio Connection Kit)は様々なアプリケーションのオーディオ/MIDIデータを接続するサウンドサーバです。

PulseAudio同様に業務用のミキサーコンソールをイメージすると良いと思いますが、こちらはMIDIにも対応しており、 DAWに搭載されているミキサーソフトウェアのような趣があります。

JackはALSA, PortAudio, CoreAudio, FreeBoB, FFADO, OSSのバックエンドとして機能します。

この意味を考えてみましょう。

例えばMIDI演奏データをコンピュータの中で再生します。 このとき、ハードウェアMIDI楽器を接続しているのであれば、MIDI演奏データを再生しているアプリケーションのMIDI出力を、MIDI楽器のMIDI入力とつなげます。 これによってMIDI楽器からコンピュータで再生しているMIDI演奏データの音が流れます。 さらにこのMIDI楽器のオーディオ出力をコンピュータに接続されたオーディオインターフェイスの入力に物理的に接続し、このオーディオインターフェイスの入力をJack上でDAWソフトウェアの入力に接続すれば、このMIDI楽器の演奏した音をDAWでレコーディングすることが可能です。

Jackはそれ自身でFirewireやUSBで接続されたMIDIデバイスと、1つのサウンドカードを扱うことができます。 USBオーディオデバイスはALSAモジュールを、FirewireオーディオデバイスはFirewireモジュールとFFADOライブラリを使用して動かしています。

さらにバッファの大きさを容易に調節することができ、サウンド再生のリアルタイム性を高めることができます。 さらにアプリケーションの再生位置同期機能もあり、複数の楽器、デバイスの連携も可能となっています。 この同期機能はネットワーク越しにも可能で、複数のマシンで連携しての演奏も可能です。

これらのことからもわかるようにJackはLinuxにおける音楽コンテンツ制作者向けのサウンドサーバーであり、 通常音を再生するだけのユーザー、あるいはアプリケーション開発者にとっては使うことのないものです。 Jackに対応したアプリケーションはそのほとんどが音楽制作用のソフトウェアであり、 それ以外はMIDI再生にも対応した高機能なプレイヤーです。

Jackを再生用途で使う意図は、総合的で高音質なサウンドシステムを作るためのものです。 そのために、あらゆる音を最終的にひとつのサウンドデバイスから出力することを想定しています。 この点で機能拡張に主眼を置いたPulseAudioとは異なります。

Jackに搭載された機能は一般の人には馴染みにくいものです。 しかし、音楽制作経験者であれば、WindowsにおけるASIOドライバと、Reason6などと似たものを感じることができるでしょう。 アプリケーションに内包するのではなく、アプリケーションの外側で接続・連携するという方式はとてもLinuxらしく、VSTやReWireなどで連携するWindowsと比べても優れた設計だと言えるでしょう。 しかし、その分Jackは複雑で難しく、なかなか望むように動作しないため、ある意味では「Linuxらしさ」を体現している存在だとも言えます。

PulseAudio

PulseAudioの概要

PulseAudioはLinuxで主に使われているサウンドサーバです。

PulseAudioの存在は「音を」「安定して」「確実に」鳴らし、 かつ「統一的に制御できるようにする」ものです。 ESDの置き換えを目指しており、アプリケーションからはPulseAudioで音を再生するコードを書くだけで煩雑な問題から開放されて確実に音声再生が実現できるようになっています。

PulseAudioはマルチプラットフォームのソフトウェアであり、LinuxだけでなくWindowsを含む各種POSIXシステムで動作します。 ただし、Windowsでの動作はやや不安定で機能も限定的です。

PulseAudioは業務用のミキサーコンソールのようなものだと思えば良いでしょう。 PulseAudioの基本機能は次のようなものです

さらに、サウンドサーバーとして、各アプリケーションが出力した音声を合成してサウンドデバイスに出力したり、 サウンドデバイスからの音声入力を各アプリケーションに分配したりすることもします。

各アプリケーションの音声出力を合成する際に、PulseAudioは出力すべきPCMのフォーマットを整える機能があります。 いわゆるリサンプリング機能です。

この機能にはふたつの意味があります。 ひとつは異なるサンプリングのデータは混ぜることができない、ということです。 出力音声に異なるサンプリングが含まれる場合、合成するためには必ずリサンプリングが必要となります。

もうひとつは、再生の確実性です。 96kHz/24bitなどのいわゆる「ハイレゾ音源」は、そのままのPCMを流しても一般的なオーディオデバイスは対応していないため鳴らすことができません。 PulseAudioは可能な限りどのような音源をどのようなオーディオデバイスで鳴らしても再生できるようにリサンプリングを行います。

アプリケーションからはPulseAudio用のコードを書くことでそのコンピュータのサウンドシステムやオーディオデバイス、音源の仕様を気にすることなく音を鳴らすことができます。 これによってアプリケーションはOSSやALSAなどの低レベルで煩雑なハードウェアアクセスを排除し、わかりやすくシンプルなアプローチが可能です。

さらに、PulseAudioはaRts, ESDなどのアダプタをもちます。 このため、aRtsやESD向けに書かれたアプリケーションでもPulseAudio経由で音声を鳴らすことができます。

また、通常PulseAudioはカーネル空間のALSAを専有します。 ALSAにはPulseAudioのみが音声を入力するようにし、排他制御状態とします。これにより、ALSAのソフトウェアミキサーの利用を避けます。 PulseAudioがALSAを専用しない場合はPulseAudioをモジュールを使用してdmixに接続する必要があります。

PulseAudioがすべてのサウンドを統一して扱うため、ALSAのPulseAudioプラグインを使用します。 これにより、ユーザー空間のALSAに入力されたサウンドはPulseAudioに転送され、PulseAudioがカーネル空間のALSAドライバーを通じて音声再生されます。 これは次のような形になります。

アプリケーション → ALSAアプリケーション(ユーザー空間)
→ PulseAudio → ALSAドライバー(カーネル空間) → サウンドデバイス

この機能を利用してALSAを直接操作しようとするアプリケーションもPulseAudioで制御することができます。 少々複雑ですが、[@fig:pulsealsa]のような構造をしていることになります。

PulseAudioとALSAの関係
PulseAudioとALSAの関係

さらに、PulseにはALSA同様にOSSで音を再生しようとするアプリケーションのためにいくつかの方法が用意されています。 典型的にはpadspラッパーを用いて転送することができます。 ALSAのOSS互換機能はPulseAudioを迂回してしまうため、無効化する必要があります。

さらにOpenALはデフォルトでPulseAudioを使用し、libaoも設定によってPulseAudioを使用することができます。

PulseAudioの活用
PulseAudioのミキサー

Pulse Audio Volume Control(pavucontrol)を使うことで個別のボリュームや、 接続すべきチャンネルを指定することができます。

また、特定のデバイスを特定のアプリケーションがALSAで専有するために、 PulseAudioの管理下から外すといったこともできます。

マイクから録音

PulseAudioは録音しているアプリケーションが録音すべきチャンネルを決めることができます。 これにより、録音を行うアプリケーションによって任意のマイクからの録音を行うことができます。

簡単なのはFFmpegによる方法でしょう。

システム音を録音

入力装置としてMonitor of …となっているものは、出力用に合成された音声です。

これを録音することにより、そのチャンネルで再生されるサウンドを録音することができます。

特定のアプリケーションの音を録音

Null Sinkを使用して仮想のチャンネルを作成します。

これにより、MySinkという名前のチャンネルができました。 アプリケーションの音声出力をNull出力とし、Monitor of Null出力を録音すればアプリケーションの録音ができます。

とすることでNull 出力ではなくMySinkと表示させることもできます。

特定アプリケーションの音を聞きながら録音

前述の方法では仮想sinkに音声が流されているため聴く方法がありません。 ストリーミングラジオを聴きながら録音したいといった場合もあるでしょう7

combined sinkを使うとその出力sinkに流された音声をcombinedされたすべてのsinkに出力します。

まずはcombinedすべきsinkを確認しましょう。

そして、combined sinkを作ります。ここでは物理的なアナログ出力であるalsa_output.pci-0000_00_1b.0.analog-stereoと、先程作成したMySinkに出力します。

これでアプリケーションの出力sinkをcombined sinkにすると、音声はアナログ出力から音声を出しつつ、仮想sinkであるMySinkに流されます。 これによってMySinkを録音すれば、音声を聞きながらアプリケーションの音を録音することができます。

実はcombined sinkにもMonitor of combined sinkが作成されます。 そのため、MySinkを作らず、アナログ出力だけに音声を出力するcombined sinkを作った場合でも目的は達成できます。

マイクの音声をスピーカーに流す

loopbackモジュールを使うことで、入力sinkから入ってきた音声をそのまま出力sinkに流すことができます。

レイテンシが大きいため、音楽レコーディングには向きませんが、マイクから入った音声を聴くことができるということは便利な場合があります。

sourceに関してはpavucontrolによって変更できるため、sinkだけ指定しても構いません。

なお、これを応用し、コンピュータにA2DPでBluetooth接続し、 コンピュータのスピーカーをBluetoothスピーカーのように扱うこともできます。

アプリケーションの音声とマイクの音声を合成して録音する

後から編集するのではなく、音声を合成して録音するには、 さらにをひとつの仮想Sinkにすべて出力し、Monitor出力を録音します。

仮想Sinkを作成し、アプリケーションの出力はすべてそのSinkにまとめてください。 必要ならば、combined sinkを作成し、モニターしながら行ってください。

そして、loopbackモジュールを使ってマイク入力もその仮想Sinkに集約します。

オーディオプラグイン

LADSPA

Linux上で動作するオーディオ信号の生成・加工を行うプラグインの規格です。 Windowsで言うところのVSTなどにあたるものです。

LADSPA自体は非常にシンプルで、内容はC言語のヘッダファイルがひとつあるだけです。 さらに、LADSPAはLinuxに依存した機能がありません。 そのため、Linuxに限らず様々なプラットフォームでLADSPAプラグインの開発・移植が可能です。

一見一般ユーザーには関係ないもののように思われがちですが、AudaciousにおいてエフェクトとしてLADSPAが使われています。 そのため、実は裏側でその恩恵に預かっているかもしれません。

DSSI

DSSIはLADSPAを拡張し、楽器プラグインに対応したものです。 Windowsで言うところのVSTiやDXiに対応したものになります。

DSSIにはdssi-vstというプログラムがあり、これによりVSTiプラグインを動作させることができます。 Linux上で動作するVSTプラグインソフトウェアは極わずかですが、Wineで動作するものであればLinux上でWindows向けのシンセサイザを利用することが可能になります。

LV2

LADSPAの後継として作られた規格です。 DSSIの機能もあり、シンセサイザも利用可能です。

フレームワーク

ESDやPulseAudio, ALSAなどはあくまでPCMでの入力が前提となっています。 PhononがPCM以外のファイルフォーマットであっても直接指定して再生できるのは、 バックエンドとなっているライブラリ(Xine, VLC, GStreamer)がデコードしているからにすぎません。

そのため、PCM以外の音声ファイルを再生するにはデコードを行ってからPulseAudioやALSAユーザー空間ライブラリに渡すなどの必要がありますが、 マルチメディアフレームワークを使用することによりその部分を外部に任せることができます。

プログラマは音声ファイルを再生する際に、音声ファイルをこれらのライブラリに渡すコードを書くことになります。 しかし、その場合その部分は使用するフレームワークに依存したコードになります。 Phononの目的はその間にPhononをはさむことで、プログラムのフレームワークへの依存性を低減し、 またコードの簡略化を果たすことにあります。

Xine

Xineは2001年と古くからあるメディアプレイヤーです。 ライブラリはFFmpegをはじめ、いくつかの成果物を集合して内包しています。

Xineはデコードした音声の出力をXine自身で行います。 Phononでは音声出力にxine-libを使うことができます。

GStreamer

動画においても多用されているGStreamerですが、音声においても不可欠なものとなっています。 GStreamerはPulseAudioへの出力をサポートしており、gst-plugins-goodとして含まれています。

GStreamerは自前でデコードを行ってPulseAudioへの直接記述を行うよりもだいぶ簡単ですし、 再生の確実性が高く、さらに高機能であるために非常に多用されています。

いくつかのコーデックはFFmpegと異なるものを採用しています。その意味でも価値があるかもしれません。 ただし、それらのコーデック品質はFFmpegに劣るとされています。

VLC

PhononにおいてはVLCが選択可能です。 VLCのコーデックはFFmpegであるため、エンコーディングはFFmpegを利用していることになります。

音声のフィルタリング、出力などをVLCのコードに任せる方式がとられます。

アプリケーション

再生

MPlayer

MPlayerは強力なマルチメディアプレイヤーです。

FFmpeg由来のコーデックを内蔵し、音声データのデコードからフィルタリングまですべて自前で行い、音声を出力します。

Audacious

AudaciousはWinampクローンであるXMMSのGtk+2バージョンです。

比較的シンプルなプレイヤーですが、ALSAデバイスを選択する機能があり、 Hi-Resな音源も再生できるため、ハイレゾプレイヤーとして使用されることもあります。

コーデックはオープンソース成果物を集めて使用しています。 また、プラグインに対応しており、コーデックを追加することもできます。

ライブラリ中のシンボリックリンクを解決することができません。

Amarok

AmarokはKDEのオーディオプレイヤーです。 Linuxでは最も高機能であり、i mobile deviceとの連携も可能です。

AmarokはGstreamerを利用していますが、これは一部機能のためであり、再生自体はPhononに依存しています。 以前はGstreamerまたはXineを再生エンジンとして使用することができました。

Clementine

ClementineはAmarok 1.4からforkしたオーディオプレイヤーです。 ツールキットにはQt4を採用し、Qt5への移植が計画されています。

ClementineはKDEの一部とはなっていないため、再生を外部に任せることなく、 システムのコーデックライブラリを利用して自身でデコードを行います。

i mobile deviceをはじめとしたポータブルオーディオプレイヤーにも対応します。

Rhytembox

RhytemboxはバックエンドにGStreamerを利用しています。

Gnome Teamによって開発されており、Gnomeのオーディオ再生機能を担っています。 Gnomeはメディア再生にはGStreamerを使用しているため、言い方を変えるとGStreamerのプレイヤーフロントエンドであるということができます。

ライブラリベースであることをはじめ、機能的な不足や振る舞いに対する不満がよく聞かれます。

制作

Audacity

Windowsでも知られているオープンソースの波形エディタです。

音声加工・修正など、ある程度の音声知識があれば楽曲制作を行うほどでなくても実用的に使うことができます。

Bwing

マルチプラットフォームの有償のDAWです。

Ableton Live!からスピンオフしたものです。 他のプラットフォーム同様にVST対応となっています。

Tracktion

WindowsやMacでもおなじみの有償のDAWです。 古いバージョンは無償配布しています。

他のプラットフォーム同様にVST対応となっています。

LMMS

LMMSは商用のDAWであるFL Studioをベースとした音楽制作ソフトウェアです。 FL Studioほど高機能ではありませんが、本格的な音楽制作が可能です。

Jackとの連携もよく、実用的です。 なんとVSTに対応しています。

Rosegarden

RosegardenはLinux向けのDAWです。 少しSONARと似ています。

Ardour

オーディオ主体でProToolsと似たDAWです。

こちらもVSTに対応しています。

Qtractor

Jackを必須とするDAWです。LogicやCubaseに通じるものを感じます。

Reaper

商用ですが無償で使えてしまうDAWです。 マルチプラットフォームとなっています。

機能的には非常に高機能で、本格的な音楽制作にも耐えます。

Mixbus

情報がなく、使ったこともないため確認できませんでした。 本格的なDAWのようです。

Renoise

商用のマルチプラットフォームのDAWです。 サンプラー機能が強力だとされています。 他のプラットフォーム同様にVST対応となっています。

seq24

seq24は極めてシンプルなMIDIシーケンサです。

機能的には他のDAWたちに著しく劣りますが、ちょっと音楽制作を体験してみたいというときにはあまりにもハードルが高く、むしろ望ましくないかもしれません。 WindowsではDominoというMIDIシーケンサに人気がありますが、それと似たような存在だと考えることができるでしょう。


  1. 標準的なビデオシステムとは、ディスプレイが2枚以下で、広く使われているデスクトップ環境やビデオアプリケーションを使い、高度なゲームは行わず、ビデオ再生は行い、高度なビデオエンコーディングは行わないものを指しています。

  2. nvというドライバもあったはずですが、消滅しています。

  3. Xを起動しない状態でコンソールログインして作業する必要があります。

  4. 同様の法律は韓国にあります。逆にEUでは私的複製を制限することを禁止する傾向にあります。

  5. 自由空間型FPSのDESCENTシリーズや、FPSのQuake、シビリアンシミュレーションゲームであるシムシティなどが有名です。

  6. ReasonはPropellerhead社のWindows/Mac向け音楽制作ソフトウェアです。

  7. もちろん、録音することが法的に問題のないようにしてください。

Fullsized Image