【发布时间】: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