Cet article présente principalement l'explication détaillée de NODEJS basée sur le test de streaming vidéo FFMPEG. L'éditeur pense que c'est assez bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur pour y jeter un œil, j'espère que cela pourra aider tout le monde.
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.
Workflow
Tirez le flux vidéo distant, le format du flux vidéo est rtsp
Convertir au format de lecture commun rtmp
Pousser vers le port de lecture rtmp://votre adresse de fin de poussée Les utilisateurs peuvent lire directement le contenu après avoir utilisé le logiciel de lecture pour s'y connecter. adresse
Outils et logiciels requis
1. Lien du site officiel de l'outil de ligne de commande ffmpeg, l'avantage de le choisir est :
Gratuit
Aucune installation requise, réduisant considérablement la complexité des opérations de l'utilisateur
Appel de démarrage en ligne de commande
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. -ffmpeg est la version 2.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 pour le moment, les résultats d'exécution de ffmpeg ne peuvent pas être contrôlés. 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 encore pourquoi fluent-ffmpeg peut notifier au processus tiers de se fermer une fois le processus d'ontologie terminé. On suppose que le processus est interrompu via une entrée en ligne de commande, ne serait-ce que via ChildProcess.kill(), le processus tiers ne peut pas être arrêté.
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.
Le modèle de conception Node.js utilise des flux pour le codage
Flux asynchrone Node.js control
nodejs implémente la fonction d'exploration du site Web images_node.jsCe 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!