ffmpeg -version
查看是否看装成功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
常用的命令行参数如下:
查看视频信息
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个命令放在一起执行
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
首先新建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等插件播放就可以了