2013-08-11 15 views
5

Chcę przekonwertować adres URL youtube na plik mp3. Obecnie mogę pobrać mp4 przy użyciu modułu ytdl węzła, tak:node.js: jak potokować - youtube do mp4 na 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)) 

Po zakończeniu pobierania, przekonwertować mp4 do mp3 przy użyciu modułu biegle-ffmpeg, tak:

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' 
     ) 

Nie chcę zapisywać całego mp4 przed rozpoczęciem konwersji mp3. Jak mogę potokować mp4 do proc, więc wykonuje konwersję, gdy otrzymuje fragmenty mp4?

Odpowiedz

8

Zamiast przechodzącą lokalizację pliku MP4, przechodzą w strumieniu ytdl jako źródło, jak w przykładzie:

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

Jeśli dobrze rozumiem, to nadal pobiera cały mp4, ale zamiast zapisywać i konwertować, konwertuje podczas pobierania/przesyłania strumieniowego. Jeśli oryginalny plik MP4 ma 80 MB, a wynikowy plik MP3 wynosi 6 MB, to pobiera 80 MB, prawda? –

+0

mp4 jest wysyłany do Ciebie za pośrednictwem strumienia, youtube Wątpię, pozwoli ci zażądać tylko sepreate mp3 stream .. musisz dl całość w innych pracach –

0

ta nie działa dla mnie. Poniższy kod działa, jeśli ustawię lokalny plik .mp4, ale użycie strumienia nie będzie możliwe.

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

jak pokazać pobieranie% w odpowiedzi. –

0

Jest to stosunkowo stare pytanie, ale może komuś pomóc w przyszłości - Natknąłem się na to sam przy poszukiwaniu podobnego rozwiązania, aby pobrać vid youtube jako mp3 bez konieczności zapisania pliku na serwerze. Zasadniczo ustaliłem konwersję bezpośrednio na odpowiedź i działa tak, jak się spodziewałem.

Początkowo odpowiedział na to pytanie w innym wątku: 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'); 
}); 

};

Powiązane problemy