繁体   English   中英

在 Node Js 中使用 FFMPEG 进行 HLS 转码的多种分辨率

[英]Multiple resolutions for HLS transcoding using FFMPEG in Node Js

我在一个 node.js 项目上工作,使用 FFMPEG 将上传的 mp4 文件转换为 HLS 格式 (.m3u8)。

我开发了这样的 function,

 ffmpeg('test.mp4', { timeout: 432000 }).addOptions([ "-profile:v baseline", "-level 3.0", "-start_number 0", "-hls_time 10", "-hls_list_size 0", "-master_pl_name master.m3u8", "-f hls" ]).output("videos/output.m3u8")

问题:这个 function 按预期工作。 但现在我希望视频以 360、480、720 和 1080 的多种格式进行转码,并期望 output of.m3u8 主文件有点像

 #EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=72000,CODECS="mp4a.40.5" output_64k_audio.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=620000,RESOLUTION=640x360,CODECS="avc1.4d001e,mp4a.40.2" output_360.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=812000,RESOLUTION=854x480,CODECS="avc1.4d001e,mp4a.40.2" output_480.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1272000,RESOLUTION=1280x720,CODECS="avc1.4d001f,mp4a.40.2" output_720.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1627000,RESOLUTION=1920x1080,CODECS="avc1.4d0028,mp4a.40.2" output_1080.m3u8

请帮我解决这个问题。

我找到了一个 package simple-hls解决了这个问题,

这是最终的解决方案:

 const { Transcoder } = require('simple-hls'); const customRenditions = (name) => { return [ { width: 640, height: 360, profile: 'main', hlsTime: '10', bv: '800k', maxrate: '856k', bufsize: '1200k', ba: '96k', ts_title: `${name}_360p`, master_title: `${name}_360p` }, { width: 640, height: 480, profile: 'main', hlsTime: '10', bv: '1400k', maxrate: '1498', bufsize: '2100k', ba: '128k', ts_title: `${name}_480p`, master_title: `${name}_480p` }, { width: 1280, height: 720, profile: 'main', hlsTime: '10', bv: '2800k', maxrate: '2996k', bufsize: '4200k', ba: '128k', ts_title: `${name}_720p`, master_title: `${name}_720p` }, { width: 1920, height: 1080, profile: 'main', hlsTime: '10', bv: '5000k', maxrate: '5350k', bufsize: '7500k', ba: '192k', ts_title: `${name}_1080p`, master_title: `${name}_1080p` } ] }; try { const transcode = new Transcoder(newFileName, fileDestFolder + '/', { renditions: customRenditions(fileName), showLogs: false }); transcode.transcode(); console.log('Successfully Transcoded Video'); } catch (e) { console.log('Something went wrong: ' + e); }

请注意,此 package 要求您在您的机器上安装 FFmpeg 软件。 就我而言,我找到了一种无需安装 FFmpeg 即可使用 simple-hls 的方法,方法是使用另一个 package @ffmpeg-installer/ffmpeg并编辑包的节点模块文件/node_modules/simple-hls/lib/index.js

const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
const ls = (0, child_process_1.spawn)(ffmpegPath, commands)

生成 child_process 时,将'ffmpeg'替换为 npm package 中的 FFmpeg 安装程序的路径,它工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM