Heim >Web-Frontend >js-Tutorial >Detaillierte Erläuterung des Video-Streaming-Tests von node.js basierend auf FFMPEG

Detaillierte Erläuterung des Video-Streaming-Tests von node.js basierend auf FFMPEG

小云云
小云云Original
2018-01-18 13:10:343178Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung von NODEJS basierend auf dem FFMPEG-Video-Streaming-Test vor. Der Herausgeber findet es ziemlich gut, daher werde ich es jetzt mit Ihnen teilen und als Referenz geben. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

Mit ffmpeg als Kern verpackt es eine Client-Software, die Transkodierung im LAN empfängt und an das Internet weiterleitet. In diesem Artikel werden nur die Grundfunktionen von ffmpeg verwendet, einschließlich Streaming, Transkodierung, Streaming und einfache Wiedergabeeinstellungen.

Workflow

  1. Ziehen Sie den Remote-Videostream, das Videostream-Format ist rtsp

  2. In das gängige Wiedergabeformat rtmp konvertieren

  3. Push an den Wiedergabeport rtmp://Ihre Push-Endadresse Benutzer können den Inhalt direkt abspielen, nachdem sie die Wiedergabesoftware verwendet haben, um eine Verbindung dazu herzustellen Adresse

Erforderliche Tools und Software

1. Link zur offiziellen Website des ffmpeg-Befehlszeilentools, der Vorteil der Auswahl ist:

  1. Kostenlos

  2. Keine Installation erforderlich, wodurch die Komplexität der Benutzerbedienung erheblich reduziert wird

  3. Startaufruf über die Befehlszeile

2. Die NodeJS-Versionsnummer ist v6.11.3. (Electron wird im eigentlichen Projekt verwendet, aber wenn es nicht erforderlich ist, es in einen Client zu packen, können NodeJS normal ausgeführt werden)

3 Die TSC-Versionsnummer ist v2.6.1. Das Projekt verwendet TypeScript als Hauptschreibsprache und es gibt kein Problem, wenn Sie JavaScript verwenden.

Wenn Sie tsc verwenden, verwenden Sie bitte Version 2.0 oder höher. Das integrierte @type-Tool verbessert die Codierungseffizienz erheblich.

4 -ffmpeg ist v2. Dieses nodejs-Paket kapselt den Befehlszeilenaufrufteil von ffmpeg, was die Lesbarkeit des Codes verbessert. Wenn Sie mit dem ffmpeg-Befehlszeilenhandbuch vertraut sind, müssen Sie dieses Paket nicht verwenden.


  npm install --save fluent-ffmpeg
  //使用js编码的用户,可以忽略下条命令
  npm install --save @types/fluent-ffmpeg

VLC-Wiedergabesoftware. Wird verwendet, um zu überwachen, ob Streaming, Transkodierung und Wiedergabe normal sind. Offizieller Website-Link

Implementierungscode


  const ffmpegPath = "./dist/ffmpegProgram/bin/ffmpeg.exe";
  const ffprobePath = "./dist/ffmpegProgram/bin/ffprobe.exe";
  const flvtoolPath = "./dist/ffmpegProgram/bin/ffplay.exe";

  export function startPushVideo():void{
    getCommands().then((commands:ffmpegPaths[])=>{
      for(let key in commands){
        let command = commands[key];
        //设置输入流地址
        let ffCommand = ffmpeg(command.inputPath)
        //设置输出流地址
        .output(command.outputPath)
        //因需要打包客户端软件,故而将ffmpeg打包进软件中
        //需设置各应用程序的对应路径
        //若仅在本机使用,可以跳过该步骤
        //设置环境变量,添加 PATH 即可
        .setFfmpegPath(ffmpegPath)
        .setFfprobePath(ffprobePath)
        .setFlvtoolPath(flvtoolPath)
        //为保证灵活性,非必须参数采用配置文件读取模式
        .size(command.size);
        for(let key in command.args){
          ffCommand.outputOption(command.args[key]);
        }
        ffCommand.on("start",(commandLine)=>{
          //commandLine 为实际上调用的命令行命令,拼接逻辑为
          //您的ffmpeg所在路径 -i inputOptions 您的拉流协议和路径 outputOptions 推送流协议和地址
          //ffmpeg -i "rtsp://yourPullUrl" -f flv -r 25 -s 640x480 -an "rtmp://yourPushUrl"
          console.log('[' + showTime() + '] Vedio is Pushing !');
          console.log('[' + showTime() + '] Spawned Ffmpeg with command !');
          console.log('[' + showTime() + '] Command: ' + commandLine);
        })
        .on('error', function(err, stdout, stderr) {
          console.log('error: ' + err.message);
          console.log('stdout: ' + stdout);
          console.log('stderr: ' + stderr);
        })
        .on('end', function() {
          console.log('[' + showTime() + '] Vedio Pushing is Finished !');
        })
        .run();
      }
    },(error)=>{
      console.log('error: ' + error);
    })
  }

Zusammenfassung

Der durch Abhören von „start“ erhaltene Befehl kann auch über exec (yourCommandLine) aufgerufen werden, aber zu diesem Zeitpunkt kann das laufende Ergebnis von ffmpeg nicht gesteuert werden. Nach Programmende läuft der ffmpeg-Prozess noch weiter, bis der Stream einen Fehler meldet oder der Prozess manuell gestoppt wird. Es ist noch nicht klar, warum fluent-ffmpeg den Drittanbieterprozess benachrichtigen kann, dass er geschlossen wird, nachdem der Ontologieprozess beendet ist. Die Vermutung ist, dass der Prozess durch die Befehlszeileneingabe unterbrochen wird. Wenn nur ChildProcess.kill() verwendet wird, kann der Drittanbieterprozess nicht heruntergefahren werden.

Bei der Ausführung auf einem I5 8G-Computer hat Single-Stream-Push etwa 35 % der CPU belegt. Multi-Stream-Push erfordert andere Lösungen.

Verwandte Empfehlungen:

Node.js Designmuster verwendet Streams zum Codieren

Node.js asynchroner Flow Steuerung

nodejs implementiert die Funktion zum Crawlen von Website-Bildern_node.js

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Video-Streaming-Tests von node.js basierend auf FFMPEG. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn