• 软件项目技术点(17)——视频转码


    AxeSlide软件项目梳理   canvas绘图系列知识点整理

    了解本节内容技术点:

    安装模块“fluent-ffmpeg” https://github.com/fluent-ffmpeg/node-fluent-ffmpeg

    API地址:http://www.ffmpeg.org/

    需求背景,我们的软件可以插入视频,并且播放视频。

    但是WebKit内核的nw.js跟chrome一样用HTML5的标签<video>去播放视频,支持的格式只有三种 Ogg、MPEG4、WebM,但是我们想支持更多的视频格式,这就需要在插入视频的时候进行格式转换,这样我们支持的视频格式可以有这么多种".webm,.ogv,.ogg,.mp4,.mov,.avi,.wmv,.mpg,.mpeg,.mkv,.rmvb"。

    下面我们插入一个mov格式的视频

     fileInput弹框选择后获取文件路径,onchange事件定义如下:

    我们调用videoInsertProcess函数对插入的视频进行处理,如下图:

     videoInsertProcess函数首先检测文件大小是否在100M之内,我们软件只支持100M以内的文件,为避免软件占用过多内存。代码如下图:

     

    判断视频是否需要进行转码的过程如下图:

    代码里也没有过多注释,主要是根据我们软件的业务需求写的逻辑,主要就是循环判断streams流,codec_type是否为video;如果是继续判断codec_name是否是我们支持的vp8,vp9,h264编码格式,如果不是的话就需要进行转码

    插入的视频如果需要转码的话,会提醒用户是否要进行转码插入,如下图提示框:

    点击转码按钮。创建ffmpeg命令, var videoEncoder = new Common.VideoEncoder(filePathStr);//filePathStr插入视频的源路径

    调用convertToWebm方法,传入目标路径,成功处理回调函数,失败处理回调函数。

    如下过程:

     函数convertToWebm的具体代码如下:

     1 //视频转换为webm格式
     2 convertToWebm(targetPath, onComplete: Function, onError: Function) {
     3     var that = this;
     4     var bit_rate = Number(targetPath["bitRate"]);
     5     var channelsgt2 = targetPath['channelsgt2'] || false;
     6     var bit_rate_str;
     7     var options = [];
     8     //计算bitRate信息,封装options
     9     if (isFinite(bit_rate)) {
    10         if (bit_rate < 1024) {
    11             bit_rate_str = Math.round(bit_rate).toString();
    12         }
    13         else if (bit_rate < 1024 * 1024) {
    14             bit_rate_str = Math.round(bit_rate / 1024).toString() + 'K';
    15         }
    16         else {
    17             bit_rate_str = Math.round(bit_rate / (1024 * 1024)).toString() + 'M';
    18         }
    19         options.push('-b:v ' + bit_rate_str);
    20     }
    21     if (channelsgt2 === true) {
    22         options.push('-ac 2');
    23     }
    24     options.push('-deadline realtime');
    25 
    26     targetPath = targetPath.valueOf();//还原target 路径
    27 
    28     that.encoder.videoCodec('libvpx')
    29         .outputOptions(options) //cpu-used -5
    30         .on('start', function (cmd) {
    31             index.showProgressBar("0%", SoftWare.transcoding_going, "", function () {
    32                 that.encoder.kill();
    33             });
    34         })
    35         .on('end', function () {
    36             document.getElementById("progress_bar").style.display = "none";
    37             onComplete(false);
    38         })
    39         .on('error', function (err) {
    40             document.getElementById("progress_bar").style.display = "none";
    41             if (err.message === "ffmpeg was killed with signal SIGKILL") {
    42                 index.showMask(true);
    43                 index.showWaitMoment(true);
    44                 return;
    45             }
    46             onError(err);
    47         })
    48         .on('progress', function (progress) {
    49             var percent: number = progress.percent;
    50             if (percent) {
    51                 index.showProgressBar(percent.toFixed(1) + "%", SoftWare.transcoding_going, "");
    52             }
    53         })
    54         .save(targetPath);
    55 }
  • 相关阅读:
    HTML5新增
    【目录】洛谷|CODEVS题解汇总
    【搜索】kkksc03考前临时抱佛脚
    【模拟】压缩技术
    【模拟】爱与愁的一千个伤心的理由
    【搜索】棋盘
    【模拟】图书管理员
    【递归】对称二叉树
    【题单】挖坑大行动
    【模拟】弹珠游戏
  • 原文地址:https://www.cnblogs.com/fangsmile/p/6283544.html
Copyright © 2020-2023  润新知