>  기사  >  웹 프론트엔드  >  FFMPEG 기반 node.js 비디오 스트리밍 테스트에 대한 자세한 설명

FFMPEG 기반 node.js 비디오 스트리밍 테스트에 대한 자세한 설명

小云云
小云云원래의
2018-01-18 13:10:343105검색

이 글은 FFMPEG 비디오 스트리밍 테스트를 기반으로 한 NODEJS에 대한 자세한 설명을 주로 소개하고 있는데, 에디터가 꽤 괜찮다고 생각해서 지금부터 공유하고 참고용으로 올려보겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

ffmpeg를 핵심으로 LAN에서 트랜스코딩을 수신하고 이를 인터넷에 푸시하는 클라이언트 소프트웨어를 패키징합니다. 이 기사에서는 스트리밍, 트랜스코딩, 스트리밍 및 간단한 재생 설정을 포함한 ffmpeg의 기본 기능만 사용합니다.

Workflow

  1. 원격 비디오 스트림을 가져옵니다. 비디오 스트림 형식은 rtsp

  2. 일반 재생 형식으로 변환합니다. rtmp

  3. 재생 포트로 푸시합니다. rtmp://푸시 끝 주소 , 사용자는 재생 소프트웨어를 사용하여 이 주소에 연결한 후 콘텐츠를 직접 재생할 수 있습니다

필수 도구 및 소프트웨어

1.ffmpeg 명령줄 도구 공식 웹사이트 링크, 선택 시 이점은 다음과 같습니다.

  1. free

  2. 설치가 필요하지 않아 사용자 작업 복잡성이 크게 줄어듭니다

  3. 명령줄 시작 호출

2 nodejs 버전 번호는 v6.11.3입니다. (실제 프로젝트에서는 Electron을 사용하지만 클라이언트에 패키징할 필요가 없다면 nodejs는 정상적으로 실행 가능합니다.)

3 tsc 버전 번호는 v2.6.1입니다. 해당 프로젝트는 TypeScript를 주요 작성 언어로 사용하고 있으며, JavaScript를 사용해도 문제가 없습니다.

tsc를 사용하는 경우 내장된 @type 도구를 사용하면 코딩 효율성이 크게 향상됩니다.

4.fluent-ffmpeg의 버전 번호는 v2.1.2입니다. 이 nodejs 패키지는 ffmpeg의 명령줄 호출 부분을 캡슐화하여 코드의 가독성을 높입니다. ffmpeg 명령줄 매뉴얼에 익숙하다면 이 패키지를 사용할 필요가 없습니다.


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

VLC 재생 소프트웨어. 스트리밍, 트랜스코딩, 재생이 정상인지 모니터링하는 데 사용됩니다. 공식 홈페이지 링크

Implementation code


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

Summary

"start"를 듣고 얻은 명령은 exec(yourCommandLine)을 통해서도 호출할 수 있지만 ffmpeg의 실행 결과는 ffmpeg에서 제어할 수 없습니다. 이번에는. 프로그램이 종료된 후에도 스트림이 오류를 보고하거나 프로세스가 수동으로 중지될 때까지 ffmpeg 프로세스는 계속 실행됩니다. Fluent-ffmpeg가 온톨로지 프로세스가 종료된 후 타사 프로세스에 종료되도록 알릴 수 있는 이유는 아직 명확하지 않습니다. 명령줄 입력을 통해 프로세스가 차단되는 것으로 추측됩니다. ChildProcess.kill()만 사용하면 타사 프로세스를 종료할 수 없습니다.

I5 8G 시스템에서 실행되는 단일 스트림 푸시는 CPU의 약 35%를 차지합니다. 멀티 스트림 푸시에는 다른 솔루션이 필요합니다.

관련 권장 사항:

Node.js 디자인 패턴은 코딩에 스트림을 사용합니다.

Node.js 비동기 흐름 제어

nodejs는 웹 사이트 크롤링 기능을 구현합니다.image_node.js

위 내용은 FFMPEG 기반 node.js 비디오 스트리밍 테스트에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.