2013-08-11 13 views
5

Voglio convertire un url di youtube in un file mp3. Attualmente, ho scaricato il mp4 utilizzando il modulo ytdl del nodo, in questo modo:node.js: how to pipe - da youtube a mp4 a 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)) 

Una volta completato il download, converto il mp4 in mp3 utilizzando il modulo fluente-ffmpeg, in questo modo:

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

Non voglio dover salvare l'intero mp4 prima di iniziare la conversione mp3. Come faccio a canalizzare mp4 in proc in modo che esegua la conversione mentre riceve i blocchi mp4?

risposta

8

Invece di passare il percorso del file MP4, passa nel flusso ytdl come fonte, in questo modo:

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

Se ho capito bene, questo scarica ancora l'intero mp4 ma invece di salvare e convertire, converte durante il download/streaming. Se il file mp4 originale è 80 MB e l'mp3 risultante è 6 MB, scarica 80 MB, giusto? –

+0

l'mp4 ti viene inviato tramite uno stream, youtube dubito che ti permetterò di richiedere solo il flusso mp3 sepreato .. devi dl il tutto in altri lavori –

0

Questo non funziona per me. Il codice qui sotto funziona se imposto un file .mp4 locale, ma l'utilizzo di stream no.

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

come mostrare% di download in risposta. –

0

Questa è una domanda relativamente vecchio, ma possono aiutare qualcuno in futuro - mi sono imbattuto su io stesso quando alla ricerca di una soluzione simile per scaricare un vid YouTube in formato MP3 senza la necessità di salvare il file sul server. Fondamentalmente ho deciso di convogliare la conversione direttamente alla risposta, e funziona come speravo.

Originariamente risposto a questa domanda in un thread diverso: 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'); 
}); 

};