部署简单的流媒体播放网页ffmpeg的安装和使用

Posted 学习做游戏中

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署简单的流媒体播放网页ffmpeg的安装和使用相关的知识,希望对你有一定的参考价值。

ffmpeg网址与下载

  • 官网
  • Github地址
    打开官网后,可以通过下面的2个地址下载解压缩的7z版本

    解压缩后,在bin目录中可以看到其中主要的文件
  • ffmpeg.exe:音视频转码、转换器
  • ffplay.exe:简单的音视频播放器
  • ffserver.exe:流媒体服务器
  • ffprobe.exe:简单的多媒体码流分析器
    解压缩,并把bin目录配置到环境变量中,执行ffmpeg -version查看是否看装成功

ffmpeg的使用

ffmpeg \\
[全局参数] \\
[输入文件参数] \\
-i [输入文件] \\
[输出文件参数] \\
[输出文件]

例如:

ffmpeg \\
-y \\ # 全局参数
-c:a libfdk_aac -c:v libx264 \\ # 输入文件参数
-i input.mp4 \\ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \\ # 输出文件参数
output.webm # 输出文件

上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 Vorbis。
如果不指明编码格式,FFmpeg 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子。

ffmpeg -i input.avi output.mp4

常用的命令行参数如下:

  • -c:指定编码器
  • -c copy:直接复制,不经过重新编码(这样比较快)
  • -c:v:指定视频编码器
  • -c:a:指定音频编码器
  • -i:指定输入文件
  • -an:去除音频流
  • -vn: 去除视频流
  • -preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, - slower, veryslow。
  • -y:不经过确认,输出时直接覆盖同名文件。
    如果比较耗费cpu,可以尝试指定threads参数。可以通过concat合并2段视频

实例

查看视频信息

ffmpeg -i input.mp4

加上-hide_banner可以精简显示

ffmpeg -i input.mp4 -hide_banner

将文件转换成h.265输出

ffmpeg -i [input.file] -c:v libx265 output.mp4

改变视频分辨率

ffmpeg \\
-i input.mp4 \\
-vf scale=480:-1 \\
output.mp4

命令行转码实例

视频先转码成h.264后再转成m3u8会极大的减少体积,所以可以将2个命令放在一起执行

  • 命令1&命令2&命令3…(无论前面命令是否故障,照样执行后面)
  • 命令1&&命令2&&命令3…(仅当前面命令成功时,才执行后面)
  • 命令1||命令2||命令3…(仅当前面命令失败时.才执行后面)
ffmpeg -i ./start/xx.mp4 -c:v libx264 out.mp4&&ffmpeg -i ./out.mp4 -c copy -map 0 -f segment -segment_list aa/video.m3u8 -segment_time 10 aa/video-%04d.ts

通过python将文件夹下所有视频转码

首先新建start文件夹,并将mp4文件放入,再新建end文件夹,用于放转码后的视频文件
完整代码如下:

import os
import re
import pathlib
import shutil
import json
from nanoid import generate

path = './start/'
for file in os.listdir(path):
    if file.endswith(".mp4"):
        file_end = re.sub(r"\\d+\\.","",file).replace("(","-").replace(")", "").replace(" ","")
        print(file)
        os.rename(os.path.join(path,file),os.path.join(path,file_end))
video_dir = pathlib.Path.cwd().joinpath("start")
videos = []
shutil.rmtree("./end")
def my_mkdir(path):    
    isExists=os.path.exists(path)
    if not isExists:        # 不存在创建
        os.makedirs(path)
        return True
    else:
        shutil.rmtree(path)           # 存在就删除后再创建
        os.makedirs(path)
        return True

def turn_video(url):
    video_name = pathlib.Path(url).stem         # 获取不包含文件后缀的文件名
    video_dir = generate('1234567890abcdef', 10)
    end_video_path = pathlib.Path.cwd().joinpath("end",video_dir)    # 拼接路径
    my_mkdir(end_video_path)
    cmd_1 = "ffmpeg -i  -c:v libx264 .mp4&&ffmpeg -i ./.mp4 -c copy -map 0 -f segment -segment_list /video.m3u8 -segment_time 10 /video-%04d.ts".format(url,video_name,video_name,end_video_path,end_video_path)
    os.system(cmd_1)
    end_video_path = "http://10.226.10.72/video//vide0.m3u8".format(video_dir)
    return video_name,end_video_path

for i in video_dir.glob("**/*"):     # 级联获取文件夹下所有文件
    v_name,v_path = turn_video(i)       # 对start文件夹下的所有视频转码
    v_dict = dict(name=v_name, path=v_path)
    videos.append(v_dict)

json_file_path = './result.json'
json_file = open(json_file_path, mode='w')
json.dump(videos, json_file, indent=4, ensure_ascii=False)

可以看到执行后输出了result.json文件,把视频部署到nginx服务中,再在前端用video.js等插件播放就可以了

使用FFmpegHLS和Nginx搭建在线视频流媒体播放系统

目录

1、综述

2、安装nginx

3、安装ffmpeg

4、安装m3u8-segmenter

5、制作m3u8文件与ts文件

6、VLC播放器中测试

7、web网页中的播放测试


       本文简单介绍一下如何使用FFmpeg、HLS和Nginx搭建在线视频流媒体播放系统,并使用浏览器进行验证测试。

1、综述

       HLS (HTTP Live Streaming)是Apple的动态率自适应技术。主要用于PC和Apple终端的音视频服务。HLS包括一个m3u8的索引文件,TS媒体分片文件和key加密串文件,m3u8文件中包含了多个ts文件片的信息。

       常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这两种是完全不同的方式,目前比较方便又好用的是用 HTTP 渐进下载方法。在这个中 Apple 公司的 HTTP Live Streaming 是这个方面的代表。它最初是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的流媒体流方式,现在已经被广泛地应用于各种直播和录播系统中。

       本文将详细讲述如何使用FFmpeg、HLS和Nginx在Linux系统中搭建一个在线视频播放系统。其中Nginx用于提供web访问服务,FFmpeg用来生成ts文件,m3u8-segmenter用来生成存放多个ts文件片信息的m3u8文件,HLS则是支持web页面直接访问后台媒体文件(m3u8和ts文件片)的协议。

2、安装nginx

       在真正安装nginx服务器软件之前,我们先得安装编译所需的依赖库。在shell中执行以下命令,使用默认安装即可,如遇权限不足,请在命令行前加sudo命令。

1)安装gcc g++的依赖库

#apt-get install build-essential
#apt-get install libtool

2)安装pcre依赖库

#apt-get install zlib1g-dev

3)安装ssl依赖库

#apt-get install openssl

    下图表明本系统中已经安装了这些依赖库:

          一切工作准备完毕,接下来就可以开始安装Nginx了,编译安装过程如下:

1)下载nginx源码压缩包

# wget http://nginx.org/download/nginx-1.11.3.tar.gz

注意:这里下载的是nginx版本是1.11.3,具体获取最新版本请至官网查询。

2)解压nginx-1.11.3.tar.gz

#tar -zxvf nginx-1.11.3.tar.gz

3)进入解压目录,配置指定安装路径

#cd nginx-1.11.3
#./configure --prefix=/usr/local/nginx

4)编译,安装

#make
#make install

    上述步骤一切顺利会在/usr/local/nginx目录中安装好编译生成的Nginx,结果如下所示:

到此,Nginx的安装结束。

3、安装ffmpeg

        这里我们使用源码编译安装FFmpeg,步骤如下:

1)下载源码,地址为:http://ffmpeg.org/download.html

2)进入ffmpeg源码目录

 将下载的ffmpeg源码拷贝到/home/share目录中,如上所示。

3)编译安装YASM

#sudo apt-get install yasm

4)安装libx264编解码库

#sudo apt-get install libx264-dev

5)配置ffmpeg,编译,安装

#./configure --enable-libx264 --enable-gpl --enable-shared --prefix=/usr/local/ffmpeg
#make
#make install

以上步骤成功会在/usr/local/ffmpeg目录中安装好ffmpeg,如下所示:

可执行文件在bin目录中。

4、安装m3u8-segmenter

       这个工具是用于分割和创建m3u8文件,它从像ffmpeg这样的工具中获取MPEG-TS流,并将其分解为多个ts-片段,适合于来自iphone等设备的HTTP流媒体流。它还创造了M3U8流描述符,这是这种类型的流所必需的。编译安装步骤如下:
1)安装libavformat-dev

#apt-get install libavformat-dev

2)进入m3u8-segmenter源码目录,编译安装

#cd /home/share/m3u8-segmenter
#aclocal
#automake -ac
#autoconf
#./configure
#make
#make install

5、制作m3u8文件与ts文件

       服务器的搭建准备工作已经就绪,现在我们来准备视频源。我们在Ubuntu系统的/home/share目录中准备了一段视频文件,接下来我们就开始制作m3u8文件与ts文件。
1)进入视频文件目录

#cd /home/share

2)调用ffmpeg制作ts文件

# LD_LIBRARY_PATH=/usr/local/ffmpeg/lib /usr/local/ffmpeg/bin/ffmpeg -i test.wmv -acodec copy -vcodec libx264 test.ts

3)制作m3u8文件

#/usr/local/bin/m3u8-segmenter -i /home/share/test.ts -n 30 -p /home/share/sample_test -m /home/share/test.m3u8 -u http://192.168.109.130/hls/

注意,由于本案例中ffmpeg的安装指定的—prefix=,因此环境变量中并没有ffmpeg的库路径和path路径。因此上面的ffmpeg使用了全路径指定,m3u8-segmenter也是如此。

      执行完上述命令之后,我们在/home/share目录中就生成了我们最终测试所需要的m3u8文件和ts文件片:

我们打开test.m3u8文件可以查看到以下内容:

m3u8文件中存储了ts时间片文件的url路径,home前面的的路径是我们在生成m3u8文件时指定的。hls//home/share/*是我们将ts文件片放到Nginx服务器html目录中的目录层级。

6、VLC播放器中测试

       我们将m3u8文件和ts文件片拷贝到nginx的web工作目录,/usr/share/nginx/html(这个路径具体与安装路径相关)。因为不是root用户,我们只用命令行去操作,具体步骤如下:

1)将ts文件片以及m3u8文件拷贝到nginx的工作目录中

#cp -r /home/share/*.ts  /usr/local/nginx/html/
# rm -f /usr/local/nginx/html/test.ts   注:test.ts不是我们要的测试文件,这里删除掉
# cp -r /home/share/test.m3u8  /usr/local/nginx/html/

2)启动Nginx

# /usr/local/nginx/nginx -c  /usr/local/nginx/conf/nginx.conf 
# /usr/local/nginx/nginx –s reload

       以上操作执行完毕后,我们的服务器就搭建好并已启动,我们在window系统中打开vlc播放器,选择媒体->打开网络串流,在编辑框中输入m3u8文件的服务器地址,如下所示:

 继续点击播放,效果如下:

7、web网页中的播放测试

        接下来我们来实现网页中播放该视频,实现步骤如下:

1)下载koko.js播放网页视频的js脚本,地址:https://www.kokoplayer.com

2)编写html网页代码,如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="pragma" content="no-cache"/>
    <meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
    <meta http-equiv="expires" content="0">
    <title>VRS</title>
</head>
<body>
    <script src="/koko.js"></script>
    <script>
    function init()
        var config = ;

        config.autoPlay = true;
        config.debug = true;
        config.iconUrl = "koko.svg";
        config.loop = true;
        config.displayDuration = false;
        config.enableTimeJump = false;
        config.enableSmartPlay = false;
        config.hideControls = true;
        config.clickToPlay = true;
        config.showPosterOnEnd = true;
        config.controls = ['fast-forward', 'fullscreen', 'volume', 'play'];
        <!--创建播放器实例对象-->
        var player = new KoKoPlayer();            
        <!--设置播放窗口以及传入相关配置参数-->
        var playerInstances = player.setup(document.querySelector("myvideo"),config);    
        playerInstances[0].mime = "video/mp4";
        playerInstances[0].source(
            type: 'video',
            title: '测试视频',
            autoplay: true,
            sources: [
                src: '/test.m3u8',<!--视频源地址-->
                type:'application/x-mpegurl'
            ],
            tracks: [
                kind: 'captions',
                label: '中文',
                srclang: 'cn',
                src: 'https://cdn.kokoplayer.com/video/hls/pirates-5/kokoplayer.vtt',
                default: true
            ]
        );
    
</script/body>
<body onload="init()">
    <!--video元素控件用来显示视频-->
    <video preload="none" type="video/mp4"> width="640" height="360" controls="true"  autoplay="autoplay"></video>
</body>
</html>

 3)将编写好的代码拷贝到服务器的html目录中,这是Nginx服务器默认的根目录

# cp -r /home/share/koko.js  /usr/local/nginx/html/
# cp -r /home/share/index.html  /usr/local/nginx/html/

         这里只为测试,将nginx根目录中index.html直接替换,因为网页输入服务器地址默认就是打开Index.html。下面我们打开火狐浏览器,输入http://192.168.109.130:

 火狐浏览器可以顺利播放。
        我们接着用IE浏览器测试一下:

IE览器可以顺利播放,测试通过。

以上是关于部署简单的流媒体播放网页ffmpeg的安装和使用的主要内容,如果未能解决你的问题,请参考以下文章

C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!

go语言调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器

Windows安装ffmpeg,使用ffmpeg从视频中的抽取图像

最简单的基于FFmpeg的移动端例子附件:IOS自带播放器

流媒体服务海康摄像头RTSP视频推流转码拉流直播综合应用:VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播

安装ffmpeg