首页 > 其他分享 >【音视频】如何部署属于自己的直播源站

【音视频】如何部署属于自己的直播源站

时间:2024-01-13 23:25:25浏览次数:29  
标签:ffmpeg stream nginx 源站 音视频 application 直播 rtmp localhost

背景

疫情3年过后,国内的视频直播火热不减,仍然是国内流量的主入口。本文将尝试在自己服务器配置nginx的直播服务器,并进行推流和拉流测试。

 

一、部署准备

1、一台centos7服务器

2、下载 nginx-rtmp-module 源码 (link

3、下载 nginx 源码 (link

 

二、开始部署

nginx的环境依赖需提前安装

yum -y install gcc gcc-c++
yum -y install pcre-devel
yum install -y zlib-devel
yum -y install openssl openssl-devel

 

参考github官网说明进行操作即可

# 编译和安装
cd /opt/nginx-1.20.2 && ./configure --add-module=/opt/nginx-rtmp-module
make
make install

 替换conf的内容 

vi conf/nginx.conf

events {
    worker_connections  1024;
}


rtmp {

    server {

        listen 1935;

        chunk_size 4000;

        # TV mode: one publisher, many subscribers
        application mytv {

            # enable live streaming
            live on;

            # record first 1K of stream
            record all;
            record_path /tmp/av;
            record_max_size 1K;

            # append current timestamp to each flv
            record_unique on;

            # publish only from localhost
            allow publish 127.0.0.1;
            deny publish all;

            #allow play all;
        }

        # Transcoding (ffmpeg needed)
        application big {
            live on;

            # On every pusblished stream run this command (ffmpeg)
            # with substitutions: $app/${app}, $name/${name} for application & stream name.
            #
            # This ffmpeg call receives stream from this application &
            # reduces the resolution down to 32x32. The stream is the published to
            # 'small' application (see below) under the same name.
            #
            # ffmpeg can do anything with the stream like video/audio
            # transcoding, resizing, altering container/codec params etc
            #
            # Multiple exec lines can be specified.

            exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
                        -f flv rtmp://localhost:1935/small/${name};
        }

        application small {
            live on;
            # Video with reduced resolution comes here from ffmpeg
        }

        application webcam {
            live on;

            # Stream from local webcam
            exec_static ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an
                               -f flv rtmp://localhost:1935/webcam/mystream;
        }

        application mypush {
            live on;

            # Every stream published here
            # is automatically pushed to
            # these two machines
            push rtmp1.example.com;
            push rtmp2.example.com:1934;
        }

        application mypull {
            live on;

            # Pull all streams from remote machine
            # and play locally
            pull rtmp://localhost pageUrl=www.example.com/index.html;
        }

        application mystaticpull {
            live on;

            # Static pull is started at nginx start
            pull rtmp://localhost pageUrl=www.example.com/index.html name=mystream static;
        }

        # video on demand
        application vod {
            play /var/flvs;
        }

        application vod2 {
            play /var/mp4s;
        }

        # Many publishers, many subscribers
        # no checks, no recording
        application videochat {

            live on;

            # The following notifications receive all
            # the session variables as well as
            # particular call arguments in HTTP POST
            # request

            # Make HTTP request & use HTTP retcode
            # to decide whether to allow publishing
            # from this connection or not
            on_publish http://localhost:8080/publish;

            # Same with playing
            on_play http://localhost:8080/play;

            # Publish/play end (repeats on disconnect)
            on_done http://localhost:8080/done;

            # All above mentioned notifications receive
            # standard connect() arguments as well as
            # play/publish ones. If any arguments are sent
            # with GET-style syntax to play & publish
            # these are also included.
            # Example URL:
            #   rtmp://localhost/myapp/mystream?a=b&c=d

            # record 10 video keyframes (no audio) every 2 minutes
            record keyframes;
            record_path /tmp/vc;
            record_max_frames 10;
            record_interval 2m;

            # Async notify about an flv recorded
            on_record_done http://localhost:8080/record_done;

        }


        # HLS

        # For HLS to work please create a directory in tmpfs (/tmp/hls here)
        # for the fragments. The directory contents is served via HTTP (see
        # http{} section in config)
        #
        # Incoming stream must be in H264/AAC. For iPhones use baseline H264
        # profile (see ffmpeg example).
        # This example creates RTMP stream from movie ready for HLS:
        #
        # ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264
        #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
        #    -f flv rtmp://localhost:1935/hls/movie
        #
        # If you need to transcode live stream use 'exec' feature.
        #
        application hls {
            live on;
            hls on;
            hls_path /tmp/hls;
        }

        # MPEG-DASH is similar to HLS

        application dash {
            live on;
            dash on;
            dash_path /tmp/dash;
        }
    }
}

# HTTP can be used for accessing RTMP stats
http {

    server {

        listen      8080;

        # This URL provides RTMP statistics in XML
        location /stat {
            rtmp_stat all;

            # Use this stylesheet to view XML as web page
            # in browser
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            # XML stylesheet to view RTMP stats.
            # Copy stat.xsl wherever you want
            # and put the full directory path here
            root /path/to/stat.xsl/;
        }

        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }

        location /dash {
            # Serve DASH fragments
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}

 

启动nginx

# 初次启动
$ ./sbin/nginx 
# 重新加载后启动
$ ./sbin/nginx -s reload

 

三、功能测试与验证

rtmp测试

ffmpeg -re  -stream_loop -1 -i test.mp4 -vcodec copy -acodec copy -f flv -y 'rtmp://ip:port/mytv/xxx'

ffplay播放效果

ffplay rtmp://ip:port/mytv/xxx

  

hls测试

ffmpeg -re  -stream_loop -1 -i test.mp4 -vcodec copy -acodec copy -f flv -y 'rtmp://ip:port/hls/xxx'

直接使用浏览器播放

 

dash测试

ffmpeg -re  -stream_loop -1 -i test.mp4 -vcodec copy -acodec copy -f flv -y 'rtmp://ip:port/dash/xxx'

ffplay播放效果

ffplay rtmp://ip:port/dash/xxx

 

四、总结

本文通过配置nginx-rtmp流媒体服务器,整体的推流和拉流功能测试通过。

 

可能出现的问题:

1、提示缺少依赖包

 请执行

yum -y install gcc-c++

2、提示没有权限 no permission

建议全程使用root权限操作, 避免权限的问题。 

标签:ffmpeg,stream,nginx,源站,音视频,application,直播,rtmp,localhost
From: https://www.cnblogs.com/SeaSky0606/p/17962248

相关文章

  • 一对一直播系统源码,后台管理系统权限控制方案
    纯前端控制前端写死配置文件,通过用户角色信息判断是否有权限。例如constanth={'admin':{//路由权限,如果路由权限为false/undefined则整个页面无权限//如果路由权限为true,则拥有全部路由下操作的权限'/home':true,......
  • 基于先进云计算技术的云会议架构平台,实现音视频及数据共享
    主要功能音视频及数据共享 支持Man、PC、iPad和Phone在共享屏幕上进行标注 支持画线、矩形、椭圆、荧光笔等各种工具协作标 最高支持1080P高清画质录制与存储 本地和云端存储 视频及音频独立文件存储 支持电子交互白板及文件共享......
  • 获取直播间的最新评论 - python 取两个list的差集
    python取两个list的差集作用:比如我要获取评论区列表,先获取了一遍,这个时候有人评论了几条,我再获取一遍后,找出多的那几条使用set数据类型来取两个列表的差集。差集表示仅包含在第一个列表中而不在第二个列表中的元素list1=[1,2,3,4,5]list2=[3,4,5,6,7]使用set取......
  • 音视频同步评估方案调研
    视频细分领域:实时视频,即时通讯音视频不同步的原因:发送和接收端处理数据的时延,网络传输时延人类所能感受到音画不同步的最大时间差:20ms(非官方)解决方案:发送端同步,接收端同步,网络传输控制相关技术领域:1、5G新通话2、音视频技术基础3、同步技术4、延时问题5、评估方案6、应用5G新通话Vo......
  • 购买自主开发体育直播系统源码的重要性,判断是否自研方法
    大型竞体项目的关注度与影响力不断延伸扩散,体育赛事直播平台的开发与运营已成为行业焦点。然而,对于许多企业来说,相比自行开发还是购买体育直播系统源码更有性价比。这其中,选择如“东莞梦幻网络科技”自主研发的一手源码具有不可忽视的重要性,不仅关乎用户体验,更直接影响到平台的生命......
  • 教学/直播/会议触摸一体机定制_基于紫光展锐T820安卓核心板方案
    触控一体机是一种集先进的触摸屏、工控、计算机等技术于一体的智能设备。传统的键盘鼠标输入功能被触摸屏所取代,触摸一体机过去主要应用于工业领域,而如今则广泛运用于课堂教学、培训、工业、会议、直播、高新科技展示等场合。它的应用使得教学、大会和展示活动可以更加互动和信......
  • 微信小程序直播(二):如何使用第三方直播插件快速实现企业直播间
    ZEGO微信小程序直播SDK可以在微信小程序中提供实时音视频直播服务,从而实现电商直播/在线教育/在线问诊/视频客服等各种业务场景。但是由于微信小程序的官方限制,在某些场景下需要额外使用ZEGO提供的小程序直播插件才能实现实时音视频直播功能。本节将介绍需要使用与不需要使用Z......
  • 最强烧脑答题直播互动猜图流量主小程序开发
    在当今的数字化时代,直播互动答题已成为一种全新的知识变现方式。它不仅有趣,而且互动性高,为观众提供了一个全新的互动体验。这种模式的核心在于通过直播、视频、微信小程序等渠道,引导用户参与答题,在娱乐中增长知识。对于互动答题小程序运营者而言,直播答题变现能力的强大不容忽视。以......
  • 全网最新整理覆盖全平台电脑、手机的7个开源免费流媒体直播平台以及完整源码和文档
    全网最新整理覆盖全平台电脑、手机的7个开源免费流媒体直播平台以及完整源码和文档。如今上到太空站、下到在家养猪,各行各业都在直播。直播之所以如此盛行,就是因为其能够给粉丝观众亲临现场的感受,以及直播过程中所附带着巨大的经济效益。这种方式可以为无法亲自到场的人表演、分享......
  • 音视频编码基础知识
    视频编码指的是通过特定的压缩技术将一种视频格式文件转换成另一种视频格式文件的过程。常见的视频编码:MPEG类MPEG1(VCD等使用),MPEG2(DVD等使用),MPEG4(DivX,XviD是它的变体),MPEG4AVC等H.26x类H.261,H.262,H.263,H.263+,H.263++,H.264,H.265常见的音频编码:MPEGAudioLayer1/2,MPE......