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

ffmpeg网址与下载

  • 官网
  • Github地址
    打开官网后,可以通过下面的2个地址下载解压缩的7z版本
    部署简单的流媒体播放网页(1)ffmpeg的安装和使用_第1张图片部署简单的流媒体播放网页(1)ffmpeg的安装和使用_第2张图片
    解压缩后,在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等插件播放就可以了

你可能感兴趣的:(音视频,python,ffmpeg)