【问题标题】:Electron ffmpeg integration电子 ffmpeg 集成
【发布时间】:2017-09-16 07:33:57
【问题描述】:

我在这里有点不知所措。我通常是一个 Coldfusion/javascript/jquery 开发人员,但现在承担了一项假设我比我知道的更多的任务。

我正在尝试在电子中编写一个应用程序,它允许我选择一组视频文件并将它们转换为 mp4 文件,同时还可以压缩它们。这些文件是足球比赛,一场正常的比赛由大约 160 场比赛和 18gb 组成。我们需要将这些压缩到大约 4GB。我曾使用 Prism 之类的程序来执行此操作,但目标用户并不精通技术,也不是都有 Windows - 有些人有 Mac。

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

我使用的是 Windows 10,但还需要在 Apple OS 上运行。请,如果您有一个简单的示例说明如何执行此操作,我将不胜感激。

谢谢! 戴夫

【问题讨论】:

  • 欢迎来到 Stack Overflow,发布一些迄今为止您尝试过的代码对您和您帖子的读者来说总是有益的。如需一些指导,您可以查看以下指南:stackoverflow.com/help/how-to-ask

标签: video ffmpeg compression electron


【解决方案1】:

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

  1. 打开您的电子基础文件夹(electron-quick-start 是默认名称),然后进入 node_modules 文件夹。在那里创建一个名为 ffmpeg 的文件夹,并将您的静态二进制文件复制到此目录中。注意:必须是静态版本,获取最新的Windows buildhere
  2. 在您的 node_modules 文件夹中,导航到 .bin 子文件夹。你需要在这里创建几个文本文件来告诉 node 包含你刚刚复制的二进制 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" "$@"
      ret=$?
    else
      node  "$basedir/../ffmpeg/ffmpeg" "$@"
      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" %*
    )
    

接下来,您可以在 Windows 电子发行版(在 renderer.js 中)中运行 ffmpeg,如下所示(我也在使用 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}` );
         });
      }

【讨论】:

  • 我确实在捆绑它时看到了您的线程,但这些命令在 Windows 上不起作用。 “cp”和“ln”被拒绝。它们适用于不同的操作系统吗? -谢谢!
  • 请注意,我在这里使用spawnSync 而不是spawn,有效地使此代码阻塞/同步。在整个循环完成之前,您将无法更新 UI。如果你想设置某种 UI 进度条,那么你需要使用带有承诺队列的异步 spawn 命令。
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2012-11-01
  • 2021-08-15
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
相关资源
最近更新 更多