>

windows平台简易直播系统搭建,FFmpeg常用推流命令

- 编辑:www.bifa688.com -

windows平台简易直播系统搭建,FFmpeg常用推流命令

以ffmpeg为骨干,包装一款局域网内接收转码并推送互连网的客户端软件。本文仅使用ffmpeg基础功用,拉流、转码、推流及简便播放设置。

    方今做直播系统的意中人许多,正好前端时间也在做那一块,写片小说分享下开荒心得,感觉后用。

1、FFmpeg推RTMP流妄想干活

行事流程

直播系统自个儿将它分为前堆推流,后台服务,客户端播放3大一些。前端推流基于ffmpeg,后台服务

率先保障自已已经安装了nginx rtmp服务器。

  1. 拉取远端录像流,录制流格式为 rtsp
  2. 转换为常用播放格式 rtmp
  3. 推送至广播端口 rtmp://您的推送端地址,用户使用播放软件连连该地方后能够平昔开展内容播放

动用crtmp服务,播放端能够动用JWPlayer(网页端播放),也得以是CGplayer。

开发配置文件nginx.conf

所需工具及软件

一.前端推流

变成如下配置

1、ffmpeg 命令行工具官方网址链接,选取它的优势在于:

    推流能够行任务令: ffmpeg -i input  -vcodec copy -acodec copy -f flv rtmp://12七.0.0.1/live/cgstream0

nginx配置.1

  1. 免费
  2. 无须安装,一点都不小的缩减用户操作复杂度
  3. 命令行运维调用

input 可以是实时代前卫,也能够是文件,借使是文件 必要加上-re。运用中需求将1二7.0.0.一换来rtmp所在机器的ip地址。

假如未有nginx rtmp服务器,请阅读笔者的另1篇简书作品

二、nodejs 版本号为 v陆.1一.3。(实际项目中采用electron,但若未有包装成客户端的要求,nodejs就能够平常运作)

    用命令推流时间戳音讯无法自由修改,想要达到叁个称心的结果如故要用代码完毕。rtmp推流前边有成文介绍过,

Mac搭建nginx rtmp服务器

三、tsc 版本号为 v二.6.一。项目采纳TypeScript为根本编写语言,您使用JavaScript也平昔不难点。

这里将第一的多少个主意介绍下,文章前面会付给完结的工程包。

二、FFmpeg推流

若使用tsc,请使用二.0上述版本,自带的@type工具会大幅度进步编码效用

      ffmpeg推流 假诺没有需求重写编码(录制源已经是编码好的多寡),推流的进程比较轻松正是二个demux和remux进度。

1.推流MP4文件

四、fluent-ffmpeg 版本号为 v2.一.贰。该nodejs包封装了ffmpeg的通令行调用有个别,加强了代码的可读性,若熟识ffmpeg 命令行使用手册,亦同意使用该包。

根本措施代码如下:

录像文件地址:/Users/xu/Desktop/bangbangbang.mp5

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

  壹.开采录制流,filename可以文件名称也能够是实时代时髦url.

推流拉流地址:rtmp://localhost:1931/rtmplive/home

VLC播放软件。用于监测推流、转码、播放是或不是健康。官方网址链接

int OpenInput(char *fileName)
{
    AVDictionary* options = nullptr; 
     context = avformat_alloc_context();
     cout << "Begin Open file Input " << endl;
     lastTime = av_gettime();
     context->interrupt_callback.callback = interrupt_cb;
    int ret = avformat_open_input(&context, fileName, nullptr,&options);
    if(ret < 0)
    {
        return  ret;
    }
    ret = avformat_find_stream_info(context,nullptr);
    return ret;
}

acc:RTMP的音频格式

完成代码

  二.创办输出上下文以及输出流,输出流的格式须要安装成flv

flv: RTMP的摄像格式

  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);
    })
  }
int OpenOutput(char *fileName)
{
    int ret = 0;
     ret  = avformat_alloc_output_context2(&outputContext, nullptr, "flv", fileName);
    if(ret < 0)
    {
        goto Error;
    }
    ret = avio_open2(&outputContext->pb, fileName, AVIO_FLAG_READ_WRITE,nullptr, nullptr);    
    if(ret < 0)
    {
        goto Error;
    }
    for(int i = 0; i < context->nb_streams; i  )
    {
        AVStream * stream = avformat_new_stream(outputContext, context->streams[i]->codec->codec);
       ret = avcodec_copy_context(stream->codec, context->streams[i]->codec);    if(ret < 0)
        {
            goto Error;
        }

    }
     ret = avformat_write_header(outputContext, nullptr);
    if(ret < 0)
    {
        goto Error;
    }
    return ret ;
Error:
    if(outputContext)
    {
        for(int i = 0; i < outputContext->nb_streams; i  )
        {
            avcodec_close(outputContext->streams[i]->codec);
        }
        avformat_close_input(&outputContext);
    }
    return ret ;
}

ffmpeg -re -i /Users/xu/Desktop/bangbangbang.mp4-vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home

小结

  三. 从输入流中读取音摄像包

安装推流.二

因而监听"start"获取的指令,亦能够通过 exec(yourCommandLine) 实行调用操作,但这时不或者调控 ffmpeg 的运转结果。该程序甘休运维之后,ffmpeg进度依旧在运转,直至流报错或手动甘休进程。临时不理解怎么 fluent-ffmpeg 能够达成在本体进度甘休后,通告关闭第一方进度。猜度是经过命令行输入切断进程,若仅透过 ChildProcess.kill() 是力不从心关闭第二方进度。

shared_ptr<AVPacket>  ReadPacketFormSource()
{
    shared_ptr<AVPacket> packet(static_cast<AVPacket*>(av_malloc(sizeof(AVPacket))), 
                     [&](AVPacket *p) { av_free_packet(p); av_freep(&p);});
    av_init_packet(packet.get());
    lastTime = av_gettime();
    int ret = av_read_frame(context, packet.get());
    if(ret >= 0)
    {       
        return packet;      
    }
    return nullptr;
}

输入指令行后,一时半刻先不要点回车,等设置好本地拉流后,再举办推流。

在I5 8G 机器上运营,单流推送已据有35%左右cpu,多流推送需利用其它方案消除。

 四. 简单易行示例

二.本土拉流MP3文件

如上便是本文的全体内容,希望对我们的求学抱有扶助,也可望大家多多扶助脚本之家。

 int main(int argc,char *argv[])   
{   
 if(argc != 3)
    {
        std::cout <<" more or less parameters "<<endl;
        this_thread::sleep_for(chrono::seconds(1000));
        return  0;
    }
    string fileInput= argv[1];
    string fileOutput = argv[2];
    thread task;
    bool streamEof = false;
    std::cout <<"input file is:"<< fileInput<< endl;
    std::cout <<"output file is:"<< fileOutput << endl;
    Init();
    if(OpenInput((char *)fileInput.c_str()) < 0)
    {
        std::cout << "Open file Input failed!" << endl;
        this_thread::sleep_for(chrono::seconds(1000));
        return 0;
    }
    std::cout <<"OpenInput successful"<<endl;
    if(OpenOutput((char *)fileOutput.c_str()) < 0)
    {
        std::cout << "Open file Output failed!" << endl;
        this_thread::sleep_for(chrono::seconds(1000));
        return 0;
    }
    std::cout <<"OpenOutput successful"<<endl;
    int count  = 0;
    auto timebase = av_q2d(context->streams[0]->time_base);
    int ret = 0;
    while(true)
    {
        auto packet = ReadPacketFormSource();

        if(packet)
        {
            ret = av_write_frame(outputContext,packet.get());
        }
        if(ret < 0 ) 
        {
            break;
        }
    }
}

打开VLC播放器

  fileOutput 能够赋值为rtmp://1二七.0.0.1/live/cgstream0,表示录像流就要推送到本地的rtmp服务,暗中认可端口是1935.

VLC.3

二. 服务端

安装播放地址

     服务端能够选用crtmpserver,crtmpserver开源,在windows平台以及linux平台下都足以运维,繁多朋友总会问crtmpserver效用

设置播放地址.四

怎样,有人嫌疑:crtmpserver是1个单线程的select模型,能不可能满意高产出的属性须求。嫌疑是创建的,有段时间自身图谋将crtmpserver改成

设置拉流地址

互动结构,后来本人依然扬弃了,因为相当的多地方下用不到,依旧等供给来了再改。大部分动静下,瓶颈并不在crtmpserver能并发多少路,而在网络

rtmp://localhost:1935/rtmplive/home

带宽能支撑多少路音摄像流。随着大家对录制品质须求的增进,基本上海广播台频的分辨率都以高清(1080p),码率基本会在四M上述。试想假如服务器

拉流地址.伍

网卡选拔千兆网卡,单个网卡最多也就协理两百多路。一般来说,服务器的cpu配置会比普通计算机高许多,援助几百路并发是不会现出质量难题。当然,

发端推流,点击open后初阶播报。

假若追求最低的安插完成最高的出现可能crtmpserver不是最棒的抉择,但品种保护实用,诸多地方下得以满意急需。提起此地,肯定有人会问,假设并

FFmpeg推流成功.六

发访问的指令上千上万如何做?答案是负载均衡。

推流成功!

    三. 播放端

3、用ffmpeg推流桌面以及推流录制头进行直播

         假诺在网页上广播(IE),能够选择JwPlayer,假若用插件的也是能够。Android端播放器假设底层基于ffmpeg,也足以播放CrtmpServer

一.假如期望将桌面录像或许分享,可以应用命令行如下:

转车的音录制流(ffmpeg须要引进librtmp库),IOS系统 同理。播放的url是rtmp://127.0.0.1/live/cgstream0。

ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:1935/rtmplive/home

    假诺须求手艺调换可加QQ 350壹玖八零70,或加群流媒体/Ffmpeg/音录像12790373肆争持,CrtmpServer以及JwPlayer能够在群里

那个只好推桌面。

一贯下载,推流部分的源码过两日,也会上传上来。

二.要是须求桌面 迈克风,举个例子一般做长途教育分享 命令行如下:

    肆. 怎么着搭建

ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/rtmplive/home

  说了半天,有个别新手朋友可能还不精晓哪些动手搭建2个简约的直播系统,怎么推流,又如何播放,下边笔者一步步介绍.

其壹能够推桌面 迈克风。

一.首先 下载CrtmpServer服务(能够直接从群里下载),运营双击文件夹下的crtmpserver.exe,假若未有闪退,表明运转成功.

叁.万1急需桌面 迈克风,并且还要摄像头拍录到温馨,比如一般用于互动主播,游戏主播,命令行如下

2.下载ffmpeg.exe (能够从群里直接下载),在命令行推行 ffmpeg -i input  -vcodec copy -acodec copy -f flv rtmp://12七.0.0.1/live/cgstream0

ffmpeg -f avfoundation -framerate 30 -i "1:0" -f avfoundation -framerate 30 -video_size 640x480 -i "0" -c:v libx264 -preset ultrafast -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/rtmplive/home

  1二七.0.0.一改成crtmpserver.exe所在服务器的地址.即使你在linux下推流,须要linux版本的ffmpeg。cgstream0可以根据供给自由修改。在  windows平台下一旦推流成功ffmpeg会平昔打字与印刷消息,出错也可能有照拂的唤起。

其一能够推桌面 迈克风,并且录制头把人口放在分界面上面

3.广播:播放能够用ffplayer.exe(能够从群里下载,那些工具对rtmp流帮助不是很好 ,播放的位置是rtmp://1二七.0.0.1/live/cgstream0 live=一),JwPlayer(用法前边有成文介绍), 仍可以用CGPlayer播放器

Snip20160713_12.png

   (那是本身写的不反省时间戳的rtmp播放器 播放的地点是rtmp://1二柒.0.0.1/live/cgstream0 live=壹)。过二日会将下载地址粘贴上去。

四、FFmpeg常用基本命令

源码地址:

1.分手录制音频流

 

ffmpeg -i input_file -vcodeccopy-an output_file_video//分离摄像流ffmpeg -i input_file -acodeccopy-vn output_file_audio//分离音频流

二.摄像解复用

ffmpeg–itest.mp4 –vcodeccopy–an–fm4vtest.264ffmpeg –itest.avi –vcodeccopy–an–fm4vtest.264

三.摄像转码

ffmpeg –i test.mp4 –vcodec h264 –s352*27八–an –f m四v test.264//转码为码流原始文件ffmpeg –i test.mp3 –vcodec h264–bf0–g贰伍–s35二*27八–an –f m四v test.264//转码为码流原始文本

ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi//转码为包装文件

-bf B帧数目调节

-g 关键帧间隔调节

-s 分辨率调节

四.录制包裹

ffmpeg –i video_file –i audio_file –vcodeccopy–acodeccopyoutput_file

五.录像区划

ffmpeg –i test.avi –r一–f image2 image-=.jpeg//提取图片ffmpeg -ss0:1:30-t0:0:20-i input.avi -vcodec copy -acodec copy output.avi//剪切摄像

-r 提取图像的成效

-ss 发轫时间

-t 持续时间

6.摄像录制

ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi

柒.YUV种类播放

ffplay -f rawvideo -video_size1920x1080 input.yuv

8.YUV序列转AVI

ffmpeg–sw*h–pix_fmtyuv420p–iinput.yuv –vcodecmpeg4output.avi

九.常用参数表明:

主要参数:

i 设定输入流

f 设定输出格式

ss 初步时间

录制参数:

b 设定录制流量,默以为200Kbit/s-r 设定帧速率,默以为二伍

s 设定画面包车型大巴宽与高-aspect 设定画面包车型地铁比重

必发88官网,vn 不管理录制-vcodec 设定录制编解码器,未设定时则采纳与输入流一样的编解码器

节奏参数:

ar 设定采集样品率

ac 设定声音的Channel数

acodec 设定声音编解码器,未设定时则应用与输入流一样的编解码器an 不管理音频

本文由必发88官网发布,转载请注明来源:windows平台简易直播系统搭建,FFmpeg常用推流命令