Yaleで、遊んで学ぶ日々。
Yaleで、遊んで学ぶ日々。
囲碁、ときどきプログラミング、ところにより経済。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Youtubeやnicovideoから動画や音楽を落とすツールとしては、Craving Explorerが非常に便利だが、Windows用に作られているのでUbuntu上ではうまく動かせない(Wineの使い方が結局よく分からない)。少し時間をかけてUbuntu上で似たような機能を実現する方法を考えてみた。
いくつか調べてみた結果、動画を落とすにはyoutube-dl、nicovideo-dl、さらに音声を抽出するにはffmepgを使うのが王道のような気がする。すべてSynaptic Package Managerからインストールできる。Youtube, nicovideo以外の動画配信サイトからの保存については後述。
youtubeの動画の音声のみを指定した保存先にダウンロードするシェルスクリプト
うまくいけば、K'naanのWavin' Flag(ワールドカップ南アフリカ大会のアンセム)がtest.mp3という名前で保存されるはず。保存名は自由に変えていいけど、空白は引数の区切りだと受け取られてしまうので、たとえば "Knaan Wavin Flag.mp3" という名前で保存したいときは
というように、スペースの前にバックスラッシュを入れる。あるいは
というふうに、全体を" "でくくる。
Wavin' Flagにはいくつかバージョンがあって、Youtubeで開くと関連動画のところに別バージョンが表示される。関連動画から動画を選ぶと、URLは
それ以外はyoutube-dlの場合と同じ。ちなみに、このURLはクラムボンのシカゴ。
ffmpegの部分でやっているのは、抽出であって変換ではない(と思う)。
-vnオプションで画像を消して、-acodec copyオプションで単純にコピーしている。だから、もともとの音声部分だけが残る。形式変換はしていない。この方法が使えるのは、動画ファイルの音声部分のコーデックがmp3形式になっている場合だけで、違う形式だとうまくいかない。正確にはmp3形式の音声ファイルにならなくて、それなのにファイル名にはmp3という拡張子がついているという状況になり、プレイヤーが混乱する恐れがある(AAC形式の音声にmp3という拡張子をつけたら、デフォルトのTotem Movie Playerは混乱した)。
今のところ、youtubeとnicovideoからの動画でmp3以外の形式に当たったことはないけど、もしそういう問題(プレイヤーがmp3ファイルを再生できないという)が生じたら、そのファイルを右クリック->propertyを開いて、Audioタブのコーデックを調べてみる。それがMP3でなければ、拡張子を適切に変える。
音声形式をmp3にエンコードし直すという手もある。mp3へのエンコードは次のようにやる。
-acオプション(チャンネル)と-abオプション(ビットレート)は好みに合わせて変える。適切なビットレートがいくつかっていうのは正直よく分からない。flvから抽出した音声ならもともと大した音質でもないので、128kで十分だと思う。CDからの変換だと192kくらいがスタンダードなのかなぁ。知らないけど。
ちなみに、ネット上の情報だと多くの場合に"libmp3lame"の部分が"mp3"になっているけど、それじゃ回らない(環境によるのか?)。理由は、mp3は出力対応コーデックに含まれていないから(特許とか表現の自由などの地域差への配慮らしい。参考)。ffmepgの対応形式を見るには、
を実行する。"D" とついているのが入力に使えるコーデック (decodable), "E" が出力に使えるコーデック (encodable). "A" は音声のコーデックであることを意味する。うちの場合、mp3にはDとAのみがついていた。対してlibmp3lameにはEとAがついている。
いくつか調べてみた結果、動画を落とすにはyoutube-dl、nicovideo-dl、さらに音声を抽出するにはffmepgを使うのが王道のような気がする。すべてSynaptic Package Managerからインストールできる。Youtube, nicovideo以外の動画配信サイトからの保存については後述。
youtubeの動画の音声のみを指定した保存先にダウンロードするシェルスクリプト
#!/bin/sh
youtube-dl -o /tmp/tmp.flv $1
ffmpeg -i /tmp/tmp.flv -vn -acodec copy -y /tmp/tmp.mp3
cp /tmp/tmp.mp3 $2
rm /tmp/tmp.flv
rm /tmp/tmp.mp3
youtube-dl -o /tmp/tmp.flv $1
ffmpeg -i /tmp/tmp.flv -vn -acodec copy -y /tmp/tmp.mp3
cp /tmp/tmp.mp3 $2
rm /tmp/tmp.flv
rm /tmp/tmp.mp3
引数1で動画のURLを指定し、引数2で保存先のファイルパスを指定する。
やっていることは至極単純で、3行目でflv動画を一時フォルダにダウンロード(-o オプションでファイル名を指定)。4行目でそこから音声部分だけを抽出。5行目で音声ファイルの名前を変えて保存先にコピー。6-7行目で一時ファイルを削除。
やっていることは至極単純で、3行目でflv動画を一時フォルダにダウンロード(-o オプションでファイル名を指定)。4行目でそこから音声部分だけを抽出。5行目で音声ファイルの名前を変えて保存先にコピー。6-7行目で一時ファイルを削除。
実験したければ、上のスクリプトを仮にdltestという名前で保存。ターミナルからdltestのあるディレクトリへ行き、以下を実行。
$ chmod u+x dltest
$ ./dltest http://www.youtube.com/watch?v=iC8V8S_REhk test.mp3
$ ./dltest http://www.youtube.com/watch?v=iC8V8S_REhk test.mp3
うまくいけば、K'naanのWavin' Flag(ワールドカップ南アフリカ大会のアンセム)がtest.mp3という名前で保存されるはず。保存名は自由に変えていいけど、空白は引数の区切りだと受け取られてしまうので、たとえば "Knaan Wavin Flag.mp3" という名前で保存したいときは
$ ./dltest http://www.youtube.com/watch?v=iC8V8S_REhk Knaan\ Wavin\ Flag.mp3.mp3
というように、スペースの前にバックスラッシュを入れる。あるいは
$ ./dltest http://www.youtube.com/watch?v=iC8V8S_REhk "Knaan Wavin Flag.mp3.mp3"
というふうに、全体を" "でくくる。
Wavin' Flagにはいくつかバージョンがあって、Youtubeで開くと関連動画のところに別バージョンが表示される。関連動画から動画を選ぶと、URLは
http://www.youtube.com/watch?v=utl-uOdX12w&feature=related
というようになり、"&feature=related"という関連動画であることを示す箇所が加わる。このURLを使うと、flvはちゃんと保存されるのだけど、続く音声抽出の段階で動きが止まる。はっきりとした理由は分からないけど、どうもyoutube-dlの仕様で、"&feature=related"がついていると、アプリケーションが自動で閉じきらないらしい(Enterキーを押すと閉じる)。そのせいで、いつまでたっても変換できないで止まっているのではないだろうか。とりあえず、"&feature=related"の部分は削るのが無難。
動画URLと保存名のリストを作っておいて、複数のファイルを保存するようにループを回すシェルスクリプトを書くこともできるが、複雑な作業をするには別の言語を使う方が何かと書きやすい。Pythonでは、os.system()メソッドを使って外部プログラムを呼ぶことができるから、例えば
動画URLと保存名のリストを作っておいて、複数のファイルを保存するようにループを回すシェルスクリプトを書くこともできるが、複雑な作業をするには別の言語を使う方が何かと書きやすい。Pythonでは、os.system()メソッドを使って外部プログラムを呼ぶことができるから、例えば
import os
import shutil
url = 'http://www.youtube.com/watch?v=iC8V8S_REhk test.mp3'
file = 'wavin flag.mp3'
os.system('youtube-dl -o /tmp/tmp.flv' + ' ' + url)
os.system('ffmpeg -i /tmp/tmp.flv -vn -acodec copy -y' + ' ' + '/tmp/tmp.mp3')
shutil.copyfile('/tmp/tmp.mp3', file)
os.remove('/tmp/tmp.flv')
os.remove('/tmp/tmp.mp3')
url = 'http://www.youtube.com/watch?v=iC8V8S_REhk test.mp3'
file = 'wavin flag.mp3'
os.system('youtube-dl -o /tmp/tmp.flv' + ' ' + url)
os.system('ffmpeg -i /tmp/tmp.flv -vn -acodec copy -y' + ' ' + '/tmp/tmp.mp3')
shutil.copyfile('/tmp/tmp.mp3', file)
os.remove('/tmp/tmp.flv')
os.remove('/tmp/tmp.mp3')
とすれば上のシェルスクリプトと同様の動作をさせることができる。Pythonならファイルの読み込みもループも比較的容易に書ける。
nicovideo-dlの使い方はyoutube-dlとほぼ同じ。違いは、user名とpassが必要だということ。
nicovideo-dlの使い方はyoutube-dlとほぼ同じ。違いは、user名とpassが必要だということ。
$ nicovideo-dl -o /tmp/tmp.flv -u <user名(email)> -p <password> http://www.nicovideo.jp/watch/sm936599
それ以外はyoutube-dlの場合と同じ。ちなみに、このURLはクラムボンのシカゴ。
ffmpegの部分でやっているのは、抽出であって変換ではない(と思う)。
$ ffmpeg -i /tmp/tmp.flv -vn -acodec copy -y /tmp/tmp.mp3
-vnオプションで画像を消して、-acodec copyオプションで単純にコピーしている。だから、もともとの音声部分だけが残る。形式変換はしていない。この方法が使えるのは、動画ファイルの音声部分のコーデックがmp3形式になっている場合だけで、違う形式だとうまくいかない。正確にはmp3形式の音声ファイルにならなくて、それなのにファイル名にはmp3という拡張子がついているという状況になり、プレイヤーが混乱する恐れがある(AAC形式の音声にmp3という拡張子をつけたら、デフォルトのTotem Movie Playerは混乱した)。
今のところ、youtubeとnicovideoからの動画でmp3以外の形式に当たったことはないけど、もしそういう問題(プレイヤーがmp3ファイルを再生できないという)が生じたら、そのファイルを右クリック->propertyを開いて、Audioタブのコーデックを調べてみる。それがMP3でなければ、拡張子を適切に変える。
音声形式の問題は、Dailymotionの動画から音声を抽出した際に起こった(クラムボンのDoggie & Maggie. 他では見つからなかった)。Dailymotionに特化したアプリケーションは見つからなかったから、ちょっと面倒くさい(ある意味簡単かも)手を使った。フラッシュ動画をブラウザで見ると、/tmpフォルダに動画ファイルが一時的に保存される。 そのファイルはページから移動すると消えてしまうのだけど、その前にコピーしてきて、ffmpegを使って音声を抽出すればいい。動画ファイルのプロパティを見てみると、音声部分のcodecがAACとなっていた。だから、抽出する際に、保存ファイル名にaac拡張子をつける(調べてみたら、AACっていうのはiTunesや着うたで使われている形式なのか。aacよりもm4aという拡張子の方が一般的かも。ソースはwiki)。Dailymotionの動画の音声コーデックがみんなAACになっているのかというと、それは分からない。こと音楽に限ってはyoutubeで8割、nicovideoで残りの8割は事が足りるから、必要になることはあまりないと思う。
音声形式をmp3にエンコードし直すという手もある。mp3へのエンコードは次のようにやる。
$ ffmpeg -i input.m4a -acodec libmp3lame -ac 2 -ab 128k output.mp3
-acオプション(チャンネル)と-abオプション(ビットレート)は好みに合わせて変える。適切なビットレートがいくつかっていうのは正直よく分からない。flvから抽出した音声ならもともと大した音質でもないので、128kで十分だと思う。CDからの変換だと192kくらいがスタンダードなのかなぁ。知らないけど。
ちなみに、ネット上の情報だと多くの場合に"libmp3lame"の部分が"mp3"になっているけど、それじゃ回らない(環境によるのか?)。理由は、mp3は出力対応コーデックに含まれていないから(特許とか表現の自由などの地域差への配慮らしい。参考)。ffmepgの対応形式を見るには、
$ ffmpeg -formats
を実行する。"D" とついているのが入力に使えるコーデック (decodable), "E" が出力に使えるコーデック (encodable). "A" は音声のコーデックであることを意味する。うちの場合、mp3にはDとAのみがついていた。対してlibmp3lameにはEとAがついている。
PR
Calender
12 | 2025/01 | 02 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Search in This Blog
Latest Comments
[03/30 川内のばば山田]
[03/30 川内のばば山田]
[08/06 Aterarie]
[07/05 Agazoger]
[07/01 Thomaskina]
Latest Posts
(11/16)
(04/28)
(04/16)
(04/11)
(04/05)
Latest Trackbacks
Category
Access Analysis