2013-08-11 71 views
5

Tôi muốn chuyển đổi url youtube thành tệp mp3. Hiện nay, tôi tải về mp4 sử dụng mô-đun ytdl nút, như vậy:node.js: cách chuyển ống - youtube sang mp4 sang 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)) 

Khi tải về xong, tôi chuyển đổi mp4 thành mp3 bằng cách sử dụng mô-đun thông thạo-ffmpeg, như vậy:

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

Tôi không muốn phải lưu toàn bộ mp4 trước khi bắt đầu chuyển đổi mp3. Làm thế nào để ống mp4 vào proc vì vậy nó thực hiện việc chuyển đổi khi nó nhận được khối mp4?

Trả lời

8

Thay vì đi qua vị trí của file mp4, vượt qua trong dòng ytdl như nguồn, như vậy:

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

Nếu tôi hiểu chính xác, điều này vẫn tải xuống toàn bộ mp4 nhưng thay vì lưu và chuyển đổi, nó chuyển đổi trong khi tải xuống/phát trực tuyến. Nếu tập tin mp4 gốc là 80MB và kết quả là mp3 là 6MB, nó tải 80MB, phải không? –

+0

mp4 được gửi đến cho bạn thông qua một luồng, youtube tôi nghi ngờ sẽ cho phép bạn yêu cầu chỉ các dòng mp3 sepreate .. bạn phải dl toàn bộ điều trong các công trình khác –

0

này không làm việc cho tôi. Mã bên dưới hoạt động nếu tôi đặt tệp .mp4 cục bộ nhưng sử dụng luồng thì không.

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

làm thế nào để hiển thị tải xuống% trong phản ứng. –

0

Đây là một câu hỏi tương đối cũ, nhưng có thể giúp ai đó trong tương lai - tôi tình cờ tự tìm kiếm giải pháp tương tự để tải xuống youtube vid dưới dạng mp3 mà không cần lưu tệp trên máy chủ. Tôi về cơ bản định cư trên đường ống chuyển đổi trực tiếp để phản ứng, và đang làm việc như tôi đã hy vọng.

Nguyên đã trả lời câu hỏi này trong một chủ đề khác nhau: 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'); 
}); 

};