Maison >interface Web >js tutoriel >Nodejs effectue un streaming vidéo en direct basé sur ffmpeg
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
Tirez le flux vidéo distant, le format du flux vidéo est rtsp
Outils et logiciels requis
1. Lien du site officiel de l'outil de ligne de commande ffmpeg, les avantages de le choisir sont :
Gratuit
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!