[英]using node-fluent-ffmpeg to transcode with ffmpeg on windows not working
[英]Ffmpeg send duration of video to client (using node-fluent-ffmpeg)
我真的對ffmpeg陌生,因此,如果這是愚蠢的問題,請原諒。
我正在使用Node-fluent-ffmpeg模塊來流電影,並使用FFMPEG將其從avi轉換為webm。
到目前為止,一切都很好(它可以播放視頻),但是我無法解析播放器的播放時間。 即使播放視頻,它也給我一個錯誤。
我的代碼如下:
var stat = fs.statSync(movie);
var start = 0;
var end = 0;
var range = req.header('Range');
if (range != null) {
start = parseInt(range.slice(range.indexOf('bytes=')+6,
range.indexOf('-')));
end = parseInt(range.slice(range.indexOf('-')+1,
range.length));
}
if (isNaN(end) || end == 0) end = stat.size-1;
if (start > end) return;
var duration = (end / 1024) * 8 / 1024;
res.writeHead(206, { // NOTE: a partial http response
'Connection':'close',
'Content-Type':'video/webm',
'Content-Length':end - start,
'Content-Range':'bytes '+start+'-'+end+'/'+stat.size,
'Transfer-Encoding':'chunked'
});
var proc = new ffmpeg({ source: movie, nolog: true, priority: 1, timeout:15000})
.toFormat('webm')
.addOptions(['-probesize 900000', '-analyzeduration 0', '-minrate 1024k', '-maxrate 1024k', '-bufsize 1835k', '-t '+duration+' -ss'])
.writeToStream(res, function(retcode, error){
if (!error){
console.log('file has been converted succesfully',retcode);
}else{
console.log('file conversion error',error);
}
});
我根據這篇文章設置了開頭和結尾的標題: http : //delog.wordpress.com/2011/04/25/stream-webm-file-to-chrome-using-node-js/
我以可變持續時間為單位計算長度(以秒為單位)。
FFmpeg給我的錯誤是:
file conversion error ffmpeg version N-52458-gaa96439 Copyright (c) 2000-2013 the FFmpeg developers
built on Apr 24 2013 22:19:32 with gcc 4.8.0 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --e
nable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable
-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --ena
ble-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwola
me --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enabl
e-libxvid --enable-zlib
libavutil 52. 27.101 / 52. 27.101
libavcodec 55. 6.100 / 55. 6.100
libavformat 55. 3.100 / 55. 3.100
libavdevice 55. 0.100 / 55. 0.100
libavfilter 3. 60.101 / 3. 60.101
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
Input #0, avi, from 'C:/temp/test.avi':
Metadata:
encoder : Nandub v1.0rc2
Duration: 00:01:09.78, start: 0.000000, bitrate: 1517 kb/s
Stream #0:0: Video: msmpeg4v3 (DIV3 / 0x33564944), yuv420p, 640x352, 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p, 222 kb/s
[libvpx @ 0036db20] v1.2.0
Output #0, webm, to 'pipe:1':
Metadata:
encoder : Lavf55.3.100
Stream #0:0: Video: vp8, yuv420p, 640x352, q=-1--1, 200 kb/s, 1k tbn, 23.98 tbc
Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp
Stream mapping:
Stream #0:0 -> #0:0 (msmpeg4 -> libvpx)
Stream #0:1 -> #0:1 (mp3 -> libvorbis)
客戶端播放器(VideoJs)說文件的長度是無限的/ NaN。
我覺得我已經很接近解決方案了,但是我對主題的缺乏經驗使我無法使用它。 如果我不清楚,請告訴我。 (我傾向於將事情解釋得很模糊。)
提前致謝!
[編輯]
我刪除了持續時間位,因為它與問題無關。 我檢查了客戶端的響應標頭,然后看到:
Accept-Ranges:bytes
Connection:keep-alive
Content-Length:13232127
Content-Range:bytes 0-13232127/13232128
Content-Type:video/webm
為什么客戶即使在標頭中收到持續時間也無法弄清楚持續時間?
不是答案,而是如何
var duration = (end / 1024) * 8 / 1024;
給定內容的持續時間,因為“ end”是源的字節數,並且您使用結果的比特率進行計算? 除非您的來源始終是1024 kbps CBR,否則這沒有任何意義。
要獲得持續時間,您必須解析/分析源文件和/或查看其元數據。
此外,ffmpeg報告輸出速率為200 kb / s,這似乎不是您想要的。
編輯:
也許您可以使用node-fluent-ffmpeg獲取源的持續時間,請參閱https://github.com/schaermu/node-fluent-ffmpeg#reading-video-metadata
我發現了問題所在。 我對響應標頭做了一些調整,但ffmpeg是故事中的惡棍。 我修復了mp3的轉碼,並獲得了客戶端解析的持續時間。 因此,由於在對元數據進行代碼轉換時我遇到了FFMPEG錯誤,因此無法正確編寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.