• 使用ffmpeg进行网络直播


    一、采集:使用python调用摄像头采集,原设想是使用树莓派摄像头采集,但是经费紧张买不起,先用摄像头凑合下,反正很简单。
                      原理就是先录一小段视频,然后循环播放,用celery做任务控制,每5秒钟录一段很小的视频,然后再循环录制。控制录制开始和停止的方法就是在redis钟设置一个键,录像程序运行的前提是这个键允许录制,如果要求录制停止就把这个键设置为停止。每5秒循环录制。正式使用后用python调用ffmpeg的命令进行推流直播,录制视频的格式是avi格式,要记得定时删除。录视频使用opencv的cv2库。注意安装最新版的opencv
    二、安装simple rtmp server:从github上下载simple rtmp server,使用rtmp播放https://github.com/ossrs/srs。
                         安装方法http://blog.csdn.net/Henry_wk/article/details/50377881
                         安装时记得apt-get的源要使用默认源
                          安装好之后改配置文件,目录在trunk/conf/rtmp.conf,配置文件如下
                          
    # the config for srs to delivery RTMP
    # @see https://github.com/ossrs/srs/wiki/v1_CN_SampleRTMP
    # @see full.conf for detail config.

    listen              1935;
    max_connections    1000;
    daemon              off;
    srs_log_tank        console;
    vhost __defaultVhost__ {
        transcode {
            # whether the transcode enabled.
            # if off, donot transcode.
            # default: off.
            enabled    on;
            # the ffmpeg 
            ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
            # the transcode engine for matched stream.
            # all matched stream will transcoded to the following stream.
            # the transcode set name(ie. hd) is optional and not used.
            engine example {
                # whether the engine is enabled
                # default: off.
                enabled        on;
                # input format, can be:
                # off, do not specifies the format, ffmpeg will guess it.
                # flv, for flv or RTMP stream.
                # other format, for example, mp4/aac whatever.
                # default: flv
                iformat        avi;
                # ffmpeg filters, follows the main input.
                vfilter {
                    # the logo input file.
                    i              ./doc/ffmpeg-logo.png;
                    # the ffmpeg complex filter.
                    # for filters, @see: http://ffmpeg.org/ffmpeg-filters.html
                    filter_complex  'overlay=10:10';
                }
                # video encoder name. can be:
                #      libx264: use h.264(libx264) video encoder.
                #      copy: donot encoder the video stream, copy it.
                #      vn: disable video output.
                vcodec          libx264;
                # video bitrate, in kbps
                # @remark 0 to use source video bitrate.
                # default: 0
                vbitrate        1500;
                # video framerate.
                # @remark 0 to use source video fps.
                # default: 0
                vfps            25;
                # video width, must be even numbers.
                # @remark 0 to use source video width.
                # default: 0
                vwidth          768;
                # video height, must be even numbers.
                # @remark 0 to use source video height.
                # default: 0
                vheight        320;
                # the max threads for ffmpeg to used.
                # default: 1
                vthreads        12;
                # x264 profile, @see x264 -help, can be:
                # high,main,baseline
                vprofile        main;
                # x264 preset, @see x264 -help, can be: 
                #      ultrafast,superfast,veryfast,faster,fast
                #      medium,slow,slower,veryslow,placebo
                vpreset        medium;
                # other x264 or ffmpeg video params
                vparams {
                    # ffmpeg options, @see: http://ffmpeg.org/ffmpeg.html
                    t              100;
                    # 264 params, @see: http://ffmpeg.org/ffmpeg-codecs.html#libx264
                    coder          1;
                    b_strategy      2;
                    bf              3;
                    refs            10;
                }
                # audio encoder name. can be:
                #      libfdk_aac: use aac(libfdk_aac) audio encoder.
                #      copy: donot encoder the audio stream, copy it.
                #      an: disable audio output.
                acodec          libfdk_aac;
                # audio bitrate, in kbps. [16, 72] for libfdk_aac.
                # @remark 0 to use source audio bitrate.
                # default: 0
                abitrate        70;
                # audio sample rate. for flv/rtmp, it must be:
                #      44100,22050,11025,5512
                # @remark 0 to use source audio sample rate.
                # default: 0
                asample_rate    44100;
                # audio channel, 1 for mono, 2 for stereo.
                # @remark 0 to use source audio channels.
                # default: 0
                achannels      2;
                # other ffmpeg audio params
                aparams {
                    # audio params, @see: http://ffmpeg.org/ffmpeg-codecs.html#Audio-Encoders
                    # @remark SRS supported aac profile for HLS is: aac_low, aac_he, aac_he_v2
                    profile:a  aac_low;
                    bsf:a      aac_adtstoasc;
                }
                # output format, can be:
                #      off, do not specifies the format, ffmpeg will guess it.
                #      flv, for flv or RTMP stream.
                #      other format, for example, mp4/aac whatever.
                # default: flv
                oformat        flv;
                # output stream. variables:
                #      [vhost] the input stream vhost.
                #      [port] the intput stream port.
                #      [app] the input stream app.
                #      [stream] the input stream name.
                #      [engine] the tanscode engine name.
                output          rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
            }
        }
    }
                  改好配置文件后启动srs,命令./obj/srs -c conf/rtmp这样就可以了
    三、编码、推流:
                  这个都使用工具完成了,是使用shell命令推流,命令为ffmpeg -re -i ./output.avi  -vcodec libx264 -acodec copy  -f flv -y rtmp://192.168.56.101/live/livestream; 
                  是使用.246编码
    四、分发: 用nginx反向代理,在nginx配置文件中加入如下,位置是和http同级
    stream{
        upstream proxybackend{
          server localhost:1935;
        }
        server {
          listen 8888;
          proxy_pass proxybackend;
          }
    }
    五、解码、播放:都用vlc media player来做了。http://mirror.os6.org/videolan/vlc/2.2.6/win32/vlc-2.2.6-win32.exe
    六、播放地址是:rtmp://192.168.56.101/live/livestream
    七、没有互动没有弹幕没有打赏没有美颜,就是那么任性
    八、关于循环录制推流的代码还在进一步测试中
  • 相关阅读:
    【字符串题目】poj 3096 Surprising Strings
    【转载】:【博弈论】博弈的学习和总结
    【博弈论】hihocoder
    转载:SPFA算法学习
    马克思所言:
    【NOIP2013】火柴排队
    【NOIP2013】【P1441】花匠
    【JZOI2002】【BZOJ1477】【P1371】青蛙的约会
    【P1373】奶牛的卧室
    2016.9.16 の 測試
  • 原文地址:https://www.cnblogs.com/wuxie1989/p/8109033.html
Copyright © 2020-2023  润新知