Javascript Fluent ffmpeg:合并视频和音频=错误帧
我正在尝试将没有音频流的视频(mp4)与音频文件(mp3)合并。我在nodewebkit下开发了一个视频软件,这意味着我必须使用ogg文件,因此当用户上传视频或音频文件时,它会将其转换为ogg格式,无论其格式如何。然后,当用户想要导出其视频时,我将帧从画布导出为PNG图像。完成后,我将以30 fps的速度从帧中创建视频,代码如下:Javascript Fluent ffmpeg:合并视频和音频=错误帧,javascript,angularjs,audio,video,ffmpeg,Javascript,Angularjs,Audio,Video,Ffmpeg,我正在尝试将没有音频流的视频(mp4)与音频文件(mp3)合并。我在nodewebkit下开发了一个视频软件,这意味着我必须使用ogg文件,因此当用户上传视频或音频文件时,它会将其转换为ogg格式,无论其格式如何。然后,当用户想要导出其视频时,我将帧从画布导出为PNG图像。完成后,我将以30 fps的速度从帧中创建视频,代码如下: var videoMaker = function () { console.log('videoMaker'); var deffered =
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');
}
我的最终文件有音乐和正确的持续时间,但帧不正确,有什么想法吗?我终于找到了解决方法,最终的视频不好,因为我将视频和音频合并到同一个视频文件中,这意味着我在写文件时通过OutStream获得了视频数据。因此,在我的程序中,我创建了一个临时文件夹,其中包含视频和音频,然后我将它们合并到另一个最终文件夹中的新视频文件中,以最终删除临时文件夹