linux下ffmpeg + livego+flv.js直播推流demo

1、检测linux服务器是否安装编译换

遇到的错误:make:*No targets specified and no makefile found. Stop.

查看 gcc 版本gcc -v

若无安装,则运行yum install gcc-c++

确保 gcc 是安装成功的,

2、安装yasm

下载yasm的source.tar.gz包,下载地址: http://yasm.tortall.net/Download.html 下载页面如下:

下载之后上传至Linux准备安装,首先解压安装包

tar -xvzf yasm-1.3.0.tar.gz

cd yasm-1.3.0/

./configure

make

make install

3、Linux下安装ffmpeg

安装成功之后继续回到ffmpeg解压后的目录,执行下面命令编译并安装

./configure --enable-shared --prefix=/monchickey/ffmpeg

make

make install

make编译过程有点长

make install会把ffmpeg相关执行程序、头文件、lib库安装在/monchickey/ffmpeg/下

cd  /monchickey/ffmpeg/bin

./ffmpeg -version 会报错误,需要创建一个文件并写入lib路径即可,执行命令: vim /etc/ld.so.conf.d/ffmpeg.conf

然后添加一行内容: /monchickey/ffmpeg/lib

之后保存并退出,然后执行 ldconfig 使配置生效,

现在再次执行 ./ffmpeg -version 显示就正常了

4、部署livego程序

编译好livego程序,具体怎么编译查看livego的https://github.com/gwuhaolin/livego说明

上传livego,livego.cfg,gorelease.yaml文件,放同一目录,然后执行运行

先运行livego程序,然后执行推流, ./ffmpeg -re -i 300.mp4 -c copy -f flv rtmp://localhost:1935/live/movie

5、部署nginx

编辑nginx.conf文件,指向路面改为flv.js存放的目录,然后重启

6、部署flv.js前端播放器

先编译好flv.js文件,具体编辑参考https://github.com/bilibili/flv.js,  建议使用cnpm编译

部署flv.js,在生成的dist目录外新建个文件,把下面代码拷贝进入,其中地址改为:http://127.0.0.1:7001/live/movie.flv

index.hmtl代码

<!DOCTYPE html>

<html>

<head>

    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">

    <title>flv.js demo</title>

    <link rel="stylesheet" type="text/css" href="demo.css" />

</head>

<body>


    <div class="mainContainer">

        <div>

            <div id="streamURL">

                <div class="url-input">

                    <label for="sURL">Stream URL:</label>

                    <input id="sURL" type="text" value="http://127.0.0.1/flv/7182741-1.flv" />

                    <button onclick="switch_mds()">Switch to MediaDataSource</button>

                </div>

                <div class="options">

                    <input type="checkbox" id="isLive" onchange="saveSettings()" />

                    <label for="isLive">isLive</label>

                    <input type="checkbox" id="withCredentials" onchange="saveSettings()" />

                    <label for="withCredentials">withCredentials</label>

                    <input type="checkbox" id="hasAudio" onchange="saveSettings()" checked />

                    <label for="hasAudio">hasAudio</label>

                    <input type="checkbox" id="hasVideo" onchange="saveSettings()" checked />

                    <label for="hasVideo">hasVideo</label>

                </div>

            </div>

            <div id="mediaSourceURL" class="hidden">

                <div class="url-input">

                    <label for="msURL">MediaDataSource JsonURL:</label>

                    <input id="msURL" type="text" value="http://127.0.0.1/flv/7182741.json" />

                    <button onclick="switch_url()">Switch to URL</button>

                </div>

            </div>

        </div>

        <div class="video-container">

            <div>

                <video name="videoElement" class="centeredVideo" controls autoplay>

                    Your browser is too old which doesn't support HTML5 video.

                </video>

            </div>

        </div>

        <div class="controls">

            <button onclick="flv_load()">Load</button>

            <button onclick="flv_start()">Start</button>

            <button onclick="flv_pause()">Pause</button>

            <button onclick="flv_destroy()">Destroy</button>

            <input style="width:100px" type="text" name="seekpoint"/>

            <button onclick="flv_seekto()">SeekTo</button>

        </div>

        <textarea name="logcatbox" class="logcatBox" rows="10" readonly></textarea>

    </div>

    <script src="../dist/flv.js"></script>


    <script>

        var checkBoxFields = ['isLive', 'withCredentials', 'hasAudio', 'hasVideo'];

        var streamURL, mediaSourceURL;

        function flv_load() {

            console.log('isSupported: ' + flvjs.isSupported());

            if (mediaSourceURL.className === '') {

                var url = document.getElementById('msURL').value;


                var xhr = new XMLHttpRequest();

                xhr.open('GET', url, true);

                xhr.onload = function (e) {

                    var mediaDataSource = JSON.parse(xhr.response);

                    flv_load_mds(mediaDataSource);

                }

                xhr.send();

            } else {

                var i;

                var mediaDataSource = {

                    type: 'flv'

                };

                for (i = 0; i < checkBoxFields.length; i++) {

                    var field = checkBoxFields[i];

                    /** @type {HTMLInputElement} */

                    var checkbox = document.getElementById(field);

                    mediaDataSource[field] = checkbox.checked;

                }

                mediaDataSource['url'] = document.getElementById('sURL').value;

                console.log('MediaDataSource', mediaDataSource);

                flv_load_mds(mediaDataSource);

            }

        }

        function flv_load_mds(mediaDataSource) {

            var element = document.getElementsByName('videoElement')[0];

            if (typeof player !== "undefined") {

                if (player != null) {

                    player.unload();

                    player.detachMediaElement();

                    player.destroy();

                    player = null;

                }

            }

            player = flvjs.createPlayer(mediaDataSource, {

                enableWorker: false,

                lazyLoadMaxDuration: 3 * 60,

                seekType: 'range',

            });

            player.attachMediaElement(element);

            player.load();

        }

        function flv_start() {

            player.play();

        }

        function flv_pause() {

            player.pause();

        }

        function flv_destroy() {

            player.pause();

            player.unload();

            player.detachMediaElement();

            player.destroy();

            player = null;

        }

        function flv_seekto() {

            var input = document.getElementsByName('seekpoint')[0];

            player.currentTime = parseFloat(input.value);

        }

        function switch_url() {

            streamURL.className = '';

            mediaSourceURL.className = 'hidden';

            saveSettings();

        }

        function switch_mds() {

            streamURL.className = 'hidden';

            mediaSourceURL.className = '';

            saveSettings();

        }

        function ls_get(key, def) {

            try {

                var ret = localStorage.getItem('flvjs_demo.' + key);

                if (ret === null) {

                    ret = def;

                }

                return ret;

            } catch (e) {}

            return def;

        }

        function ls_set(key, value) {

            try {

                localStorage.setItem('flvjs_demo.' + key, value);

            } catch (e) {}

        }

        function saveSettings() {

            if (mediaSourceURL.className === '') {

                ls_set('inputMode', 'MediaDataSource');

            } else {

                ls_set('inputMode', 'StreamURL');

            }

            var i;

            for (i = 0; i < checkBoxFields.length; i++) {

                var field = checkBoxFields[i];

                /** @type {HTMLInputElement} */

                var checkbox = document.getElementById(field);

                ls_set(field, checkbox.checked ? '1' : '0');

            }

            var msURL = document.getElementById('msURL');

            var sURL = document.getElementById('sURL');

            ls_set('msURL', msURL.value);

            ls_set('sURL', sURL.value);

            console.log('save');

        }

        function loadSettings() {

            var i;

            for (i = 0; i < checkBoxFields.length; i++) {

                var field = checkBoxFields[i];

                /** @type {HTMLInputElement} */

                var checkbox = document.getElementById(field);

                var c = ls_get(field, checkbox.checked ? '1' : '0');

                checkbox.checked = c === '1' ? true : false;

            }

            var msURL = document.getElementById('msURL');

            var sURL = document.getElementById('sURL');

            msURL.value = ls_get('msURL', msURL.value);

            sURL.value = ls_get('sURL', sURL.value);

            if (ls_get('inputMode', 'StreamURL') === 'StreamURL') {

                switch_url();

            } else {

                switch_mds();

            }

        }

        function showVersion() {

            var version = flvjs.version;

            document.title = document.title + " (v" + version + ")";

        }

        var logcatbox = document.getElementsByName('logcatbox')[0];

        flvjs.LoggingControl.addLogListener(function(type, str) {

            logcatbox.value = logcatbox.value + str + '\n';

            logcatbox.scrollTop = logcatbox.scrollHeight;

        });

        document.addEventListener('DOMContentLoaded', function () {

            streamURL = document.getElementById('streamURL');

            mediaSourceURL = document.getElementById('mediaSourceURL');

            loadSettings();

            showVersion();

            flv_load();

        });

    </script>


</body>

</html>


demo.css 代码

.mainContainer {

    display: block;

    width: 100%;

    margin-left: auto;

    margin-right: auto;

}

@media screen and (min-width: 1152px) {

    .mainContainer {

        display: block;

        width: 1152px;

        margin-left: auto;

        margin-right: auto;

    }

}

.video-container {

    position: relative;

    margin-top: 8px;

}

.video-container:before {

    display: block;

    content: "";

    width: 100%;

    padding-bottom: 56.25%;

}

.video-container > div {

    position: absolute;

    top: 0;

    left: 0;

    right: 0;

    bottom: 0;

}

.video-container video {

    width: 100%;

    height: 100%;

}

.urlInput {

    display: block;

    width: 100%;

    margin-left: auto;

    margin-right: auto;

    margin-top: 8px;

    margin-bottom: 8px;

}

.centeredVideo {

    display: block;

    width: 100%;

    height: 100%;

    margin-left: auto;

    margin-right: auto;

    margin-bottom: auto;

}

.controls {

    display: block;

    width: 100%;

    text-align: left;

    margin-left: auto;

    margin-right: auto;

    margin-top: 8px;

    margin-bottom: 10px;

}

.logcatBox {

    border-color: #CCCCCC;

    font-size: 11px;

    font-family: Menlo, Consolas, monospace;

    display: block;

    width: 100%;

    text-align: left;

    margin-left: auto;

    margin-right: auto;

}

.url-input , .options {

    font-size: 13px;

}

.url-input {

    display: flex;

}

.url-input label {

    flex: initial;

}

.url-input input {

    flex: auto;

    margin-left: 8px;

}

.url-input button {

    flex: initial;

    margin-left: 8px;

}

.options {

    margin-top: 5px;

}

.hidden {

    display: none;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。