ffmpeg 视频处理有fluent-ffmpeg例子

2019-10-23 10:23:43

这里有简单的ffmpeg-fluent一个例子

参考地址  ffmpeg 视频处理


  • 给 input.mp4 视频,加上 input.png 水印 位置为 x:y

ffmpeg -i input.mp4 -i input.png -filter_complex overlay=x:y -acodec copy output.mp4
  • 拼接两个视频,按照 input.txt 中的顺序 ,两个视频必须同样的尺寸

// input.txt 的内容// file 'input1.mp4'// file 'input2.mp4'ffmpeg -f concat -safe 0 -i input.txt -c copy output.mp4
  • 加文字水印

ffmpeg -i input.flv -vf "drawtext=fontfile=simhei.ttf: text='雷':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" drawtext.mp4
  • 加上node

const ffmpeg = require('fluent-ffmpeg');var fs = require('fs');var path = require('path');var vname = '6619626578831740000';var input = './input';var output = './output';var middle = './middle';// 用 endingH 生成 endingW 视频// ffmpeg(path.join(__dirname, middle, `endingH.mp4`))// .size('960x540').autopad('black')// .on('error', function (err) {//     console.log('生成endingW视频发生错误: ' + err.message);// }).on('end', function () {//     console.log('生成endingW视频成功');// }).save(path.join(__dirname, middle, `endingW.mp4`));new Promise((resolve) => {

    ffmpeg(path.join(__dirname, input, `${vname}.mp4`))
    .ffprobe(0, function(err, metadata) {
        !!err && console.log('无法读取视频大小:' + err.message);
        var endName = metadata.streams[0].height > 600 ? 'endingH' : 'endingW';
        var out = fs.createWriteStream(path.join(__dirname, middle, 'input.txt'), 'utf8');
        out.write(`file '${path.join(__dirname, input, vname)}.mp4'\nfile '${path.join(__dirname, middle, endName)}.mp4'`)
        out.end;
        out.on('ready', function () {
            console.log('创建文本成功');
             resolve();
        });
    });}).then(() => {

    return new Promise((resolve) => {
        ffmpeg(path.join(__dirname, middle,'input.txt'))
        .inputOptions(
            '-f','concat',
            '-safe','0'
        ).on('error', function (err) {
            console.log('合并视频发生错误: ' + err.message);
        }).on('end', function () {
            console.log('合并视频成功');
            resolve();
        }).save(path.join(__dirname, middle, 'first.mp4'));
    });
    }).then(() => {

    return new Promise((resolve) => {
        ffmpeg(path.join(__dirname, middle, 'first.mp4'))
        .input(path.join(__dirname, middle, 'logo.png'))
        .inputOptions(
            '-filter_complex','overlay=10:10'
        ).on('error', function (err) {
            console.log('水印添加错误: ' + err.message);
        }).on('end', function () {
            console.log('水印添加成功');
            resolve();
        }).save(path.join(__dirname, middle, 'second.mp4'));
    });}).then(() => {

    return new Promise((resolve) => {
        ffmpeg(path.join(__dirname, middle, 'second.mp4'))
        .videoFilters("drawtext=fontfile=simhei.ttf:text='tttttTTT':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2")
        .on('error', function (err) {
            console.log('文字水印添加错误: ' + err.message);
        }).on('end', function () {
            console.log('文字水印添加成功');
            resolve();
        }).save(path.join(__dirname, output, `${vname}.mp4`));
    });}).then(() => {
    console.log(path.join(__dirname, output, `${vname}.mp4`));})// [https://github.com/Nana-Cti/fluent-ffmpeg-watermark](https://github.com/Nana-Cti/fluent-ffmpeg-watermark)
1人点赞
游戏与3D效果
作者:总有妖孽勾引我_cf18
链接:https://www.jianshu.com/p/25816cc8a6bc
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


  • 2018-04-18 15:56:00

    linux下如何实现mysql数据库每天自动备份定时备份

    备份是容灾的基础,是指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机的硬盘或阵列复制到其它的存储介质的过程。而对于一些网站、系统来说,数据库就是一切,所以做好数据库的备份是至关重要的!

  • 2018-04-18 20:44:19

    $(...).live is not a function

    jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(...).live is not a function错误。

  • 2018-04-19 16:31:03

    mysql双机热备的实现

    准备两个mysql,A和B,A为主,B为从。前提是这两个数据库现在的表结构要一模一样,否则不成功。这个要锁表处理了。

  • 2018-04-19 16:32:47

    mysql binlog_do_db参数设置的坑

    在配置文件中想当然地配置成binlog_do_db=test,xx,jj,以为是三个库。结果无论什么操作都没有binlog产生

  • 2018-04-20 02:11:58

    Android中finish掉其它的Activity

    在Android开发时,一般情况下我们如果需要关掉当前Activity非常容易,只需要一行代码 this.finish;即可。 那么,如果是想要在当前Activity中关掉其它的Activity应该怎么实现呢? 比如更改了某个设定,程序需要重新运行并加载新的配置文件,就要用到restart或finish让程序重启。

  • 2018-04-20 09:12:07

    如何在 7 分钟内黑掉 40 家网站?

    去年夏天我开始学习信息安全与黑客技术。在过去的一年中,我通过参加各种战争游戏、夺旗以及渗透测试模拟,不断提高我的黑客技术,还学习了很多关于“如何让计算机偏离其预期行为”的新技术。

  • 2018-04-25 00:46:48

    Android开发笔记——SharedPreferences 存储实体类以及任意类型

    我们常常要用到保存数据,Android中常用的存储方式有SQLite,sharedPreferences 等,当然也有各自的应用场景,前者适用于保存较多数据的情形,后者责倾向于保存用户偏好设置比如某个checkbox的选择状态,用户登录的状态等等,都是以键值对的形式进行的文件读取,可以存储String,int,booean等一些基本数据类型等等。

  • 2018-04-25 11:48:44

    Java泛型详解

    泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除。