node.js - ffmpeg 输出始终具有输出 mp4 的卡住部分

标签 node.js video ffmpeg fs

所以稍微澄清一下,我有一个视频文件夹,我想将它们合并为一个。我查看了多个溢出,我尝试的所有操作都以错误告终。前几个视频工作,然后在后面的那些它只是卡住。但是,我仍然可以听到音频。我目前将此作为我的 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/

相关文章:

node.js - Node.js 性能优化

mysql - Sequelize - 创建 1 对 N 关系时标识符名称 'xxx_idx' 太长

javascript - 将带有 Promise 的对象数组转换为普通数组

ffmpeg - 启用 VideoJS 播放 .mov

ffmpeg - 在 Ubuntu 16.04 上使用 start-stop-daemon 启动服务并超时

FFmpeg:为什么 avcodec_receive_frame 需要额外的数据包来获取 I 帧

node.js - docker push 说镜像不存在

video - 从ffmpeg中的图像创建视频时设置比特率不起作用

python - ffmpeg如何将mpg编码为2 channel aac?

android - PhoneGap 播放 m3u8 视频