【问题标题】:How to create mp4 to multi bitrate hls(.m3u8) Stream With fluent-ffmpeg如何使用fluent-ffmpeg创建多比特率hls(.m3u8)流的mp4
【发布时间】:2020-12-14 16:32:12
【问题描述】:
ffmpeg -hide_banner -y -i beach.mkv \
  -vf scale=w=640:h=360:force_original_aspect_ratio=decrease -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 4 -hls_playlist_type vod  -b:v 800k -maxrate 856k -bufsize 1200k -b:a 96k -hls_segment_filename beach/360p_%03d.ts beach/360p.m3u8 \
  -vf scale=w=842:h=480:force_original_aspect_ratio=decrease -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 4 -hls_playlist_type vod -b:v 1400k -maxrate 1498k -bufsize 2100k -b:a 128k -hls_segment_filename beach/480p_%03d.ts beach/480p.m3u8 \
  -vf scale=w=1280:h=720:force_original_aspect_ratio=decrease -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 4 -hls_playlist_type vod -b:v 2800k -maxrate 2996k -bufsize 4200k -b:a 128k -hls_segment_filename beach/720p_%03d.ts beach/720p.m3u8 \
  -vf scale=w=1920:h=1080:force_original_aspect_ratio=decrease -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -hls_time 4 -hls_playlist_type vod -b:v 5000k -maxrate 5350k -bufsize 7500k -b:a 192k -hls_segment_filename beach/1080p_%03d.ts beach/1080p.m3u8

将此命令转换为fluent-ffmpeg节点js:

我的代码:

let ffmpeg = require('fluent-ffmpeg');
new ffmpeg()
        .addInput('./public/class.mp4')
        .outputOptions([
            '-map 0:v',
            '-map 0:v',
            '-map 0:a',
            '-map 0:a',
            '-s:v:0 426x240',
            '-c:v:0 libx264',
            '-b:v:0 400k',
            '-c:a:0 aac',
            '-b:a:0 64k',
            '-s:v:1 640x360',
            '-c:v:1 libx264',
            '-b:v:1 700k',
            '-c:a:1 aac',
            '-b:a:1 96k',
            //'-var_stream_map', '"v:0,a:0 v:1,a:1"',
            '-master_pl_name playlist.m3u8',
            '-f hls',
            '-max_muxing_queue_size 1024',
            '-hls_time 4',
            '-hls_playlist_type vod',
            '-hls_list_size 0',
            '-hls_segment_filename ./public/output/v%v/segment%03d.ts'
        ])
        .output('./public/output/v%v/master.m3u8')
        .on('start', function (commandLine) {
            console.log('Spawned Ffmpeg with command: ' + commandLine);
            res.write('<p>' + commandLine + '</p>');
        })
        .on('error', function (err, stdout, stderr) {
            console.error('An error occurred: ' + err.message, err, stderr);
            res.write('<p>' + err.message + '</p>');
        })
        .on('progress', function (progress) {
            console.log('Processing: ' + progress.percent + '% done');
            console.log(progress);
            /*percent = progress.percent;
            res.write('<h1>' + percent + '</h1>');*/
        })
        .on('end', function (err, stdout, stderr) {
            console.log('Finished processing!' /*, err, stdout, stderr*/);
            res.write('Finished processing!');
        })
        .run();

此代码仅生成一个比特率 .m3u8 流。

我尝试了很多方法来通过节点 js 生成多比特率 hls 流,但总是生成单一比特率。 我已经尝试过 bash 命令,效果很好,现在我想将此命令转换为 nodejs 脚本。

有人知道吗?

【问题讨论】:

  • 你为什么评论了-var_stream_map?这个通常用于告诉 FFmpeg 如何创建主播放列表(包含有关变体的信息)。
  • 是的,我知道。但如果我取消注释 -var_stream_map 就会给我错误(错误:未定义 v:1,a:1)。如果我注释掉它只有一个比特率段流。
  • @VinayVadachhak 你有解决办法吗?
  • @mauliksakhare 是的,我找到了解决方案。我生成 bash 文件并通过节点 js 执行。我们可以调节和动态传递 bash 参数,因为需要创建变量并传入 bash 文件

标签: ffmpeg hlsl m3u8 fluent-ffmpeg


【解决方案1】:

我最近发布了一个名为simple-hls 的进行多比特率转码的npm module。开箱即用,以下代码将为您提供 360p 到 1080p。

npm install --save simple-hls

import {Transcoder} from 'simple-hls'

async function transcodeSomething () {
    //Create a new instance of the transcoder
    //First Parameter is the path to the video that you want to transcode
    //Second Parameter is the path to the folder/directory you would like the HLS Files Saved
    //Third Parameter is an optional options object

    const t = new Transcoder(`${__dirname}/test.mp4`, `${__dirname}/path_to_output_directory`, {showLogs: false});
    try {
        const hlsPath = await t.transcode();
        console.log('Successfully Transcoded Video');
    } catch(e){
        console.log('Something went wrong');
    }
    
}

所有演绎版都将被转码并在输出目录中可用。

【讨论】:

  • 感谢这个 npm 库,出色的工作
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2018-06-23
  • 2016-05-04
相关资源
最近更新 更多