所以稍微澄清一下,我有一个视频文件夹,我想将它们合并为一个。我查看了多个溢出,我尝试的所有操作都以错误告终。前几个视频工作,然后在后面的那些它只是卡住。但是,我仍然可以听到音频。我目前将此作为我的 video.js ...
import { exec } from 'child_process';
import * as fs from 'fs';
let folders = fs.readdirSync('./videos')
folders.forEach(element => {
if(element != '.DS_Store'){
let videos = fs.readdirSync('./videos/'+element)
fs.writeFileSync('./videos/'+element+'/list.txt','')
try {
fs.rmSync('./videos/'+element+'/combined.mp4')
} catch (error) {
//console.log(error)
}
let list = ''
videos.forEach(video => {
if(video != 'list.txt' && video != '.DS_Store' && video != 'combined.mp4'){
fs.appendFileSync('./videos/'+element+'/list.txt',('file '+video+'\n'))
list += `file ${video}`
list += "\n"
}
});
var writeStream = fs.createWriteStream('./videos/'+element+'/list.txt')
writeStream.write(list)
writeStream.end()
exec(`ffmpeg -hwaccel d3d11va -safe 0 -ss 0 -f concat -i ${'./videos/'+element+'/list.txt'} -c copy -copyinkf -vsync 1 -s 1920x1080 -sws_flags lanczos -c:v h264 ${'./videos/'+element+'/combined.mp4'}`, {maxBuffer: 1024 * 100000},(error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`);
return;
}
else{
console.log("videos are successfully merged")
}
})
}
});
有任何想法吗?在 Mac 和 Windows 上都试过
最佳答案
终于有时间解决这个问题。我能够从另一篇文章中找到解决方案。
解决此问题的第一步是将每个 MP4 文件转换为“首先将它们转码为中间流”。我是通过
let list = ''
videos.forEach(video => {
if (video != 'list.txt' && video != '.DS_Store' && video != 'combined.mp4' && video.split('.')[1] != 'ts') {
fs.appendFileSync('./videos/'+element+'/list.txt',('file '+video+'\n'))
list += `file ${video}.ts`
list += "\n"
exec('ffmpeg -i ./videos/'+element+'/'+video+' -c copy -bsf:v h264_mp4toannexb -f mpegts ./videos/'+element+'/'+video+'.ts', {maxBuffer: 1024 * 100000},(error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`);
return;
} else {
console.log("Converted "+video)
}
})
}
});
然后下一步就是像往常一样连接它们......exec('ffmpeg -f concat -safe 0 -i ./videos/'+element+'/list.txt'+' -c copy ./videos/'+element+'/'+element+'output.mp4', {maxBuffer: 1024 * 100000},(error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`);
return;
} else {
console.log("videos are successfully merged")
}
})
Referenced来自 T.Todua
的具体回答和 Ed999
关于node.js - ffmpeg 输出始终具有输出 mp4 的卡住部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72073605/