1
Vote

使用ffmpeg解决视频合并效率低下

description

因为合并视频本质是把这些编码等参数完全相同的视频放到一块, 使用普通的视频合并不仅效率低下, 而且会降低视频画质, 最好使用 ffmpeg 的无损视频合并的方法...

见ffmpeg官方文档

我自己用制作了一个 nodejs 的脚本, 可以运行把一个文件夹下(就是一个专辑下)的那些视频分别合并, 放到这个文件夹下的 over 文件夹下..., 需要 asyncnice-xml 模块...希望能有一点帮助.
var fs = require('fs');
var xml = require('nice-xml');
var exec = require('child_process').exec;
var async = require('async');
fs.readdir('./', function (err, files) {
    var acplayFiles = [];
    files.forEach(function (filename, index) {
        if (filename.indexOf('acplay') != - 1) {
            acplayFiles.push(filename);
        }
    });
    async.eachSeries(acplayFiles, function iterator(file, callback) {
        fs.readFile(file, 'utf-8', function (err, data) {
            var videos = xml.parse(data).AcPlayConfiguration.Videos.Video;
            var videoname = file.substring(0, file.indexOf('.acplay'));
            videos.forEach(function (Video) {
                fs.appendFile(videoname + '.txt', "file './" + Video.FileName + "'\r\n");
            });
            var str = 'D:/Software/ffmpeg/ffmpeg-20140221-git-8c55ff3-win32-static/bin/ffmpeg -f concat -i "' + videoname + '.txt" -c copy "./over/' + videoname + '.flv"';
            exec(str, function (error, stdout, stderr) {
                console.log('stdout: ' + stdout);
                console.log(videoname+'结束');
                callback(error);
            });
            //callback();
        })
    }, function (err) {
        if(err) console.log(err);
    });
});
代码丑得一比...

comments

kaedei wrote Apr 3, 2014 at 12:31 PM

AcDown当初没有选择用视频连接的方式合并视频,原因主要是 没有办法保证下载回来的视频是相同编码的(官方文档中的”exactly the same codec and codec parameters“),所以不能使用 -c copy 开关,因为虽然大家平时下载AB站视频多一些,但是AcDown框架本身是需要提供对其他站点视频的支持的。另外在”视频合并“选项卡中,用户可以选择多个不同编码的视频进行合并,所以也没办法使用直接复制流的方式。

当然你提供的思路也有借鉴意义,因为我发现官方有提供合并不同编码视频的教程,虽然没太看懂就是了。

此外,AcDown现在处理视频合并的流程是这样的:
1.将待合并的视频分别按照参数转码成mpeg格式,现在的参数是
-i {0} -f mpeg -sameq -y -r 29.97 {1}
2.将转码出来的文件用二进制合并到新mpeg文件中
3.再把这个新mpeg文件重新编码,现在的参数是
 -i {0} -f mp4 -acodec libfaac -ab 94k -vcodec libx264 -y {1}
4.最后删除所有临时文件

这样的做法能保证最大限度的兼容性,但很明显效率也是最低的。

以上两个参数可以在 %AppData%\Kaedei\AcDown\config.xml 文件中进行修改,但总的流程是不能变的。