Maison >interface Web >js tutoriel >Nodejs effectue un streaming vidéo en direct basé sur ffmpeg

Nodejs effectue un streaming vidéo en direct basé sur ffmpeg

php中世界最好的语言
php中世界最好的语言original
2018-04-14 15:39:0813829parcourir

Cette fois, je vais vous présenter des nodejs basés sur ffmpeg pour le streaming vidéo en direct. Quelles sont les précautions pour les nodejs basés sur ffmpeg pour le streaming vidéo en direct. Ce qui suit est un cas pratique, jetons un coup d'œil.

Avec ffmpeg comme noyau, il contient un logiciel client qui reçoit le transcodage sur le réseau local et le transmet à Internet. Cet article utilise uniquement les fonctions de base de ffmpeg, notamment les paramètres de streaming, de transcodage, de streaming et de lecture simple.

Flux de travail

  1. Tirez le flux vidéo distant, le format du flux vidéo est rtsp

  2. , convertissez-le au format de lecture commun rtmp

  3. et poussez-le vers le port de lecture rtmp ://votre adresse push End, les utilisateurs peuvent directement lire le contenu après avoir utilisé le logiciel de lecture pour se connecter à cette adresse

Outils et logiciels requis

1. Lien du site officiel de l'outil de ligne de commande ffmpeg, les avantages de le choisir sont :

  1. Gratuit

  2. Aucune installation requise, réduisant considérablement la complexité des opérations de l'utilisateur

  3. Appel de démarrage en ligne de commande

2. Le numéro de version de nodejs est v6.11.3. (Electron est utilisé dans le projet réel, mais s'il n'est pas nécessaire de le packager dans un client, nodejs peut fonctionner normalement)

3. Le numéro de version tsc est v2.6.1. Le projet utilise TypeScript comme langage d'écriture principal, et il n'y a aucun problème si vous utilisez JavaScript.

Si vous utilisez tsc, veuillez utiliser la version 2.0 ou supérieure. L'outil @type intégré améliorera considérablement l'efficacité du codage

. 4. Le numéro de version de fluent-ffmpeg est v2.1.2. Ce package nodejs encapsule la partie d'appel de ligne de commande de ffmpeg, ce qui améliore la lisibilité du code. Si vous connaissez le manuel d'utilisation de la ligne de commande ffmpeg, vous n'avez pas besoin d'utiliser ce package.

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

Logiciel de lecture VLC. Utilisé pour contrôler si le streaming, le transcodage et la lecture sont normaux. Lien du site officiel

Code d'implémentation

  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);
    })
  }

Résumé

La commande obtenue en écoutant "start" peut également être appelée via exec(yourCommandLine), mais ffmpeg ne peut pas être contrôlé pour le moment résultats d’exploitation. Une fois le programme terminé, le processus ffmpeg est toujours en cours d'exécution jusqu'à ce que le flux signale une erreur ou que le processus soit arrêté manuellement. On ne sait pas pourquoi fluent-ffmpeg Vous pouvez demander au processus tiers de se fermer une fois le processus d'ontologie terminé. L'hypothèse est d'interrompre le processus via une entrée en ligne de commande, ne serait-ce que via ChildProcess.kill() Il est impossible de fermer les processus tiers.

Lors de l'exécution sur une machine I5 8G, le push mono-flux a occupé environ 35 % du processeur. Le push multi-flux nécessite d'autres solutions.

Je pense que vous maîtrisez la méthode de lecture de cet article. Pour plus de passionnant, veuillez prêter attention aux autres articles connexes sur le site Web PHP chinois !

Lecture recommandée :

Explication détaillée des étapes de définition des styles globaux dans Vue2.0

Utilisez NodeJS pour transcoder vidéos

Quelles sont les étapes requises pour implémenter un composant Angular4 FormText complet

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn