基于Python ffmpeg实现视频编码转换

前言
用户上传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官方下载地址

你可能感兴趣的:(python)