前言
用户上传MP4格式的视频之后,前端由vue-video-play插件实现的播放功能却不能播放。经过研究,MP4格式的视频具有H264、MPEG4、H264、VP6(已淘汰)四个编码格式。发现h5不支持其他编码格式,支持H264格式的编码。因此,需要对非H264编码格式进行转换。
1.系统环境:win10,python 3.6
2.所用库 pymediainfo,ffmpeg.exe
关键实现步骤
1 使用mediainfo获取视频编码格式,当然也可以使用ffmpeg来获取。
mi = MediaInfo.parse(file)
myFormat = mi.to_data()['tracks'][1]['format']
2 使用ffmpeg转码
-vcodec h264 :转码为h264,-threads 5 -preset ultrafast:转码运行较慢,开启多线程。
cmd = "ffmpeg.exe"+ " -i " + "input.mp4" + " -vcodec h264 -threads 5 -preset ultrafast " + "output.mp4"
os.system(cmd)
实现代码
以下代码具有专用性特殊性,请根据需求自行修改。
import os
import time
from pymediainfo import MediaInfo
import logging
# ffmpeg.exe path 需要写绝对路径,或者把ffmpeg.exe文件放到同级py文件
fftool = "ffmpeg.exe"
def dealVideo(srcPath):
file = srcPath
# 判断文件夹是否存在
if os.path.exists(file):
pass
else:
# 文件不存在退出
logging.warning("file not exit:",file)
return
if file.endswith(".mp4") or file.endswith(".MP4"):
try:
p, f = os.path.split(file)
newP = os.path.join(p, videoId + f)
# 使用mediainfo工具获取视频编码格式
mi = MediaInfo.parse(file)
myFormat = mi.to_data()['tracks'][1]['format']
if myFormat != "AVC":
logging.info(file, myFormat)
# 处理视频cmd命令
cmd = fftool + " -i " + file + " -vcodec h264 -threads 5 -preset ultrafast " + newP
cmd = cmd.replace("\\","/")
os.system(cmd)
else:
print("not deal",myFormat)
except IOError:
logging.error("处理失败:",file)
if __name__ == '__main__':
global addVideoList
global videoId
videoId = "temporary-h264-"
addVideoList = []
# star 用于记录当前处理到第几个视频文件
star = 0
while True:
# 打开保存有视频路径的txt
with open("video.txt", mode="r") as f:
count = 0
for line in f.readlines():
line = line.strip('\n')
if count == star:
dealVideo(line)
# 处理了一个视频,指针加一
star+=1
count += 1
参考文章
https://www.cnblogs.com/Neeo/articles/11677715.html
https://blog.csdn.net/COCO56/article/details/108231726
ffmpeg官方下载地址