javascript - Fluent-ffmpeg : merging video and audio = wrong frames

标签 javascript angularjs audio video ffmpeg

我正在尝试将没有音频流的视频(mp4)与音频文件(mp3)合并。我正在 nodewebkit 下开发一个视频软件,这意味着我必须使用 ogg 文件,因此当用户上传视频或音频文件时,它会将其转换为 ogg 格式,无论其格式如何。然后,当用户想要导出其视频时,我将 Canvas 中的帧导出为 PNG 图像。完成此操作后,我将使用以下代码从 30 fps 的帧创建视频:

var videoMaker = function () {

    console.log('videoMaker');

    var deffered = Q.defer();
    if (!FS.existsSync($rootScope.project.path + '/video')) {
        filestorageService.createFolder($rootScope.project.path + '/video');
    }
    audioMaker().then(function () {
        var commandVideo = new Ffmpeg({
            source: $rootScope.project.path + '/frames/%d.png'
        });
        commandVideo.setFfmpegPath(ffmpegPath);
        commandVideo.addOptions(['-c:v libx264', '-r 30']).withFpsInput(30).format('mp4').on('error', function (err) {
            console.log('video', err);
        }).on('end', function () {
            console.log('video win');
            deffered.resolve();
        }).save($rootScope.project.path + '/video/rendu.mp4');
    });
    return deffered.promise;
};

然后我将用户上传的音频重新转换为 mp3:
var audioMaker = function () {

    console.log('audioMaker');
    var deffered = Q.defer();
    if ($rootScope.project.settings.music.path !== '') {
        FS.writeFileSync($rootScope.project.path + '/music/finalMusic.mp3', null);
        var commandAudio = new Ffmpeg({
            source: $rootScope.project.settings.music.path
        });
        commandAudio.setFfmpegPath(ffmpegPath);
        if ($rootScope.project.settings.music.fadeIn) {
            commandAudio.audioFilters('afade=t=in:ss=0:d=0.5');
        }
        console.log($rootScope.project.settings.music.fadeOut, $rootScope.project.settings.music.fadeIn);
        if ($rootScope.project.settings.music.fadeOut) {
            var time = sceneService.getTotalDuration() - 0.5;
            commandAudio.audioFilters('afade=t=out:st=' + time + ':d=0.5');
        }
        commandAudio.toFormat('mp3').on('end', function () {
            console.log('audio win');
            deffered.resolve();
        }).on('error', function (err) {
            console.log('audio', err);
        }).save($rootScope.project.path + '/music/finalMusic.mp3');
    } else {
        deffered.resolve();
    }
    return deffered.promise;
};

在一切正常之前,这些文件运行良好,但是当我这样做时:
var command = new Ffmpeg({
    source: $rootScope.project.path + '/video/rendu.mp4'
});
command.setFfmpegPath(ffmpegPath);
console.log($rootScope.project.settings.music.path !== '');
if ($rootScope.project.settings.music.path !== '') {
    command.addInput($rootScope.project.path + '/music/finalMusic.mp3');
    command.addOptions(['-c:v copy', '-c:a copy']);
    if ($rootScope.project.settings.music.duration > sceneService.getTotalDuration()) {
        command.addOptions(['-shortest']);
    }
    command.on('error', function (err) {
        console.log(err);
    }).on('end', function () {
        console.log("win");
        //filestorageService.rmFolder($rootScope.project.path + '/frames');
    }).save($rootScope.project.path + '/video/rendu.mp4');
} else {
    filestorageService.rmFolder($rootScope.project.path + '/frames');
}

我的最终文件有音乐和正确的持续时间,但帧不正确,有什么想法吗?

最佳答案

我终于找到了解决这个问题的方法,最终的视频并不好,因为我将视频和音频合并到同一个视频文件中,这意味着我在写文件时通过外流获取视频数据.所以在我的程序中,我创建了一个包含视频和音频的临时文件夹,然后我将它们合并到一个新的视频文件中,该文件位于另一个最终文件夹中,以最终删除临时文件夹。

关于javascript - Fluent-ffmpeg : merging video and audio = wrong frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30595594/

相关文章:

javascript - 页面刷新后,ui-router 看不到 url 搜索参数

javascript - 使用 Blob 将使用 Google 字体的 SVG 转换为 Canvas

javascript - 毫无根据的安全不安全消息

actionscript-3 - AS3和麦克风类

javascript - 音频 JavaScript

javascript - 获取 DOM 元素的性能差异

angularjs - Angular 从 Controller 数据填充 Bootstrap 模态形式

angularjs - 使用条件设置标题属性并使用 Angular 翻译

javascript - 添加时如何滚动到 li

android - Android 中麦克风阈值监控的最低电池消耗