2013-08-11 30 views
5

私はyoutubeのURLをmp3ファイルに変換したいです。現在、私はそうのように、ノードのytdlモジュールを使用してのMP4をダウンロード:node.js:youtube to mp4 to mp3

fs = require 'fs' 
ytdl = require 'ytdl' 

url = 'http://www.youtube.com/watch?v=v8bOTvg-iaU' 
mp4 = './video.mp4' 

ytdl(url).pipe(fs.createWriteStream(mp4)) 

ダウンロードが完了すると、私はそうのような、流暢-ffmpegのモジュールを使用してmp3にMP4に変換する:

ffmpeg = require 'fluent-ffmpeg' 

mp4 = './video.mp4' 
mp3 = './audio.mp3' 

proc = new ffmpeg({source:mp4}) 
proc.setFfmpegPath('/Applications/ffmpeg') 
proc.saveToFile(mp3, (stdout, stderr)-> 
      return console.log stderr if err? 
      return console.log 'done' 
     ) 

mp3変換を開始する前にmp4全体を保存する必要はありません。どのようにmp4をprocにパイプして、mp4のチャンクを受け取って変換を実行するのですか?代わりに、mp4ファイルの場所を渡すの

答えて

8

、そうのように、ソースとしてytdlストリームに渡す:

stream = ytdl(url) 

proc = new ffmpeg({source:stream}) 
proc.setFfmpegPath('/Applications/ffmpeg') 
proc.saveToFile(mp3, (stdout, stderr)-> 
      return console.log stderr if err? 
      return console.log 'done' 
     ) 
+0

私が正しく理解していれば、これはまだmp4全体をダウンロードしますが、保存と変換の代わりに、ダウンロード/ストリーミング中に変換します。元のmp4ファイルが80MBでmp3が6MBの場合、80MBがダウンロードされます。 –

+0

mp4はストリームを介してあなたに送られます、私はあなたが他の作品ですべてのものをdlする必要がありますsepreate mp3ストリームだけを要求することを疑います。 –

0

これは私のために動作しません。下のコードは、ローカルの.mp4ファイルを設定してもストリームを使用しない場合に機能します。

var ytUrl = 'http://www.youtube.com/watch?v=' + data.videoId; 
     var stream = youtubedl(ytUrl, { 
      quality: 'highest' 
     }); 
     var saveLocation = './mp3/' + data.videoId + '.mp3'; 

     var proc = new ffmpeg({ 
      source: './mp3/test.mp4' //using 'stream' does not work 
     }) 
      .withAudioCodec('libmp3lame') 
      .toFormat('mp3') 
      .saveToFile(saveLocation, function(stdout, stderr) { 
       console.log('file has been converted succesfully'); 
      }); 
+0

どのようにダウンロード%を表示するには応答。 –

0

これは、比較的古い質問ですが、将来的に誰かを助けるかもしれない - サーバー上のファイルを保存することなく、mp3としてユーチューブのVIDをダウンロードするための同様のソリューションを探していたとき、私はそれに自分自身をつまずきました。私は基本的に反応への変換を直接配管することで解決し、私が望んでいたように働いています。

はもともと別のスレッドでこの質問に答え:ffmpeg mp3 streaming via node js

module.exports.toMp3 = function(req, res, next){ 
var id = req.params.id; // extra param from front end 
var title = req.params.title; // extra param from front end 
var url = 'https://www.youtube.com/watch?v=' + id; 
var stream = youtubedl(url); //include youtbedl ... var youtubedl = require('ytdl'); 

//set response headers 
res.setHeader('Content-disposition', 'attachment; filename=' + title + '.mp3'); 
res.setHeader('Content-type', 'audio/mpeg'); 

//set stream for conversion 
var proc = new ffmpeg({source: stream}); 

//currently have ffmpeg stored directly on the server, and ffmpegLocation is the path to its location... perhaps not ideal, but what I'm currently settled on. And then sending output directly to response. 
proc.setFfmpegPath(ffmpegLocation); 
proc.withAudioCodec('libmp3lame') 
    .toFormat('mp3') 
    .output(res) 
    .run(); 
proc.on('end', function() { 
    console.log('finished'); 
}); 

};