2017-04-19 54 views
-1

我在这里头在我的头上。我通常是一个coldfusion/javascript/jquery开发者,但现在已经承担了一项假设我比我更了解的任务。电子ffmpeg集成

我想写一个应用程序在电子,这将允许我选择一组视频文件,并将其转换为mp4文件,同时也压缩它们。这些文件是足球比赛,一场正常比赛由大约160场比赛和18GB组成。我们需要将这些压缩到4GB左右。我已经使用Prism这样的程序来执行此操作,但预期的用户在技术上并不精通,他们也都没有窗口 - 有些用户使用Mac。

我有一个电子项目,我已经开始,并得到第一部分工作。我可以启动应用程序并选择输入文件。但我已经尝试了各种不同的在线解决方案来调用ffmpeg并将它传递给parms来转换文件。有没有简单的方法可以用parms调用ffmpeg,然后在继续之前等待它完成?

我在Windows 10上,但也需要在Apple OS上运行。请,如果你有一个简单的例子来说明如何做到这一点,我将不胜感激。

谢谢! Dave

回答

0

首先,您需要弄清楚如何将ffmpeg与您的应用捆绑在一起。这里是a thread我开始在OSX应用程序的前端。捆绑的Windows分配需要遵循不同的程序:

  1. 打开电子基础文件夹(电子快速启动是默认的名称),然后进入node_modules文件夹。在那里创建一个名为ffmpeg的文件夹,并将静态二进制文件复制到此目录中。注意:它必须是静态版本,请抓住最新的Windows版本here
  2. 在您的node_modules文件夹中,导航到.bin子文件夹。您需要在这里创建几个文本文件来告诉节点包含刚才复制的二进制exe文件。使用您喜欢的文本编辑器,并创建两个文件,一个名为ffmpeg具有以下内容:

    #!/bin/sh 
    basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") 
    
    case `uname` in 
        *CYGWIN*) basedir=`cygpath -w "$basedir"`;; 
    esac 
    
    if [ -x "$basedir/node" ]; then 
        "$basedir/node" "$basedir/../ffmpeg/ffmpeg" "[email protected]" 
        ret=$? 
    else 
        node "$basedir/../ffmpeg/ffmpeg" "[email protected]" 
        ret=$? 
    fi 
    exit $ret 
    

    而第二个文本文件,命名为ffmpeg.cmd

    @IF EXIST "%~dp0\node.exe" (
    "%~dp0\node.exe" "%~dp0\..\ffmpeg\ffmpeg" %* 
    ) ELSE (
        @SETLOCAL 
    @SET PATHEXT=%PATHEXT:;.JS;=;% 
    node "%~dp0\..\ffmpeg\ffmpeg" %* 
    ) 
    

接下来,您可以运行的ffmpeg在您的Windows电子分布中(在renderer.js中)如下所示(我也在使用app-root-dir节点模块):

var appRootDir = require('app-root-dir').get(); 
var ffmpegpath = appRootDir + '\\node_modules\\ffmpeg\\ffmpeg'; 

//filelist[] has already been populated 
const 
    spawn = require('child_process').spawnSync; 
    for (var i = 0; i < filelist.length; i++) { 
     var outfile = filelist[i] + '.mp4'; 
     var ffmpeg = spawn('cmd.exe', ['/c', '"'+ffmpegpath+ '"', '-i', filelist[i], '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-c:a', 'aac', '-y', outfile])); 
     //add whatever switches you need here, test command line first 
     ffmpeg.stdout.on('data', data => { 
      console.log(`stdout: ${data}`); 
     }); 
     ffmpeg.stderr.on('data', data => { 
      console.log(`stderr: ${data}`); 
     }); 
     } 
+0

我确实看到了捆绑它的线程,但这些命令在Windows上不起作用。 “cp”和“ln”被拒绝。他们是否为不同的操作系统? -谢谢! –

+0

我已经添加了Windows dist的代码。 – UltrasoundJelly

+0

请注意,我在此使用'spawnSync'而不是'spawn',从而有效地使此代码阻塞/同步。在整个循环完成之前,您将无法更新UI。如果你想设置某种UI进度条,那么你需要使用带有promise队列的异步'spawn'命令。 – UltrasoundJelly