0

我正在尝试使用 ffmpeg-python 将视频文件压缩到 python 中的目标大小作为我课程的一部分,我一直收到这个错误,说它不知道编码器。不知道我打算做什么,因为这对我来说确实是一个全新的空间。我是否打算安装编解码器或其他东西,或者我可以使用其他替代方案?

import os, ffmpeg
##import section:this part is where I import all of the modules I will use
import  tkinter
import shutil
from tkinter import filedialog
import os


def fileSelect():                                                                           #start of fileSelect function
    global startingLocation                                                                 #declares startingLocation as global variable
    global originalName                                                                     #declares originalName as global variable
    global fileType                                                                         #declares fileType as global variable
    startingLocation = filedialog.askopenfilename(initialdir="/", title="Select file",      #tkinter function that opens file explorer, lets user select file saves the file path as a variable
                    filetypes=(("video files", "*.mp4"),("images", "*.jpg*")))
    originalName = os.path.basename(startingLocation)                                       #os function that gets the actaul file name from the path string
    print (originalName)                                                                    #print statement to check if originalName has been found
    fileType = startingLocation.split('.')                                                  #splits original name where any full stop in found and saves array as variable
    fileType = fileType[-1]                                                                 #changes variable to have the str value of the final item in the array; the file type
    fileType = '.' + fileType                                                               #adds fullstop to the start of the file type so i dont have to repeatedly do it
    print (fileType)                                                                        #print statement to check file type is found correctly

def outputSelect():                                                                         #start of outputSelect function
     global outputLocation                                                                  #declares outputLocation as global variable
     outputLocation = filedialog.askdirectory(initialdir="/", title="Select folder")        #tkinter function that opens file explorer, lets the user select of folder as saves the folder path as a variable

def fileNewName():                                                                          #start of fileNewName function
    global customName                                                                       #declares customName as global variable
    customName = input("Enter the end name of your file")                                   #simple code assigning user input to the custom name vairable
    customName = customName + fileType                                                      #add the fileType onto the end of the custom name

def compress():                                                                             #start of compress function
    fileSelect()                                                                            #calls the fileSelect function
    outputSelect()                                                                          #calls the outputSelect function
    fileNewName()
    global src
    global dst                                                                           #calls the fileNewName function
    src = startingLocation                                                                  #assigns startingLocation str as src, so the shutil module is able to use it in a cleaner way
    dst = outputLocation                                                                    #assigns outputLocation dst as src, so the shutil module is able to use it in a cleaner way
    shutil.copy(src, dst)                                                                   #shutil command that copies the file from src to dst
    src = outputLocation + '/' + originalName                                               #reassigns src as the location of the file copy
    dst = outputLocation + '/' + customName                                                 #reassigns dst as the location of the file copy but with a new name
    shutil.move(src,dst)


def compress_video(video_full_path, output_file_name, target_size):
    # Reference: https://en.wikipedia.org/wiki/Bit_rate#Encoding_bit_rate
    min_audio_bitrate = 32000
    max_audio_bitrate = 256000

    probe = ffmpeg.probe(video_full_path)
    # Video duration, in s.
    duration = float(probe['format']['duration'])
    # Audio bitrate, in bps.
    audio_bitrate = float(next((s for s in probe['streams'] if s['codec_type'] == 'audio'), None)['bit_rate'])
    # Target total bitrate, in bps.
    target_total_bitrate = (target_size * 1024 * 8) / (1.073741824 * duration)

    # Target audio bitrate, in bps
    if 10 * audio_bitrate > target_total_bitrate:
        audio_bitrate = target_total_bitrate / 10
        if audio_bitrate < min_audio_bitrate < target_total_bitrate:
            audio_bitrate = min_audio_bitrate
        elif audio_bitrate > max_audio_bitrate:
            audio_bitrate = max_audio_bitrate
    # Target video bitrate, in bps.
    video_bitrate = target_total_bitrate - audio_bitrate

    i = ffmpeg.input(video_full_path)
    ffmpeg.output(i, os.devnull,
                  **{'c:v': 'libx264', 'b:v': video_bitrate, 'pass': 1, 'f': 'mp4'}
                  ).overwrite_output().run()
    ffmpeg.output(i, output_file_name,
                  **{'c:v': 'libx264', 'b:v': video_bitrate, 'pass': 2, 'c:a': 'aac', 'b:a': audio_bitrate}
                  ).overwrite_output().run()

compress()
compress_video(dst, outputLocation, 3 * 1000)
4

1 回答 1

0

很可能,根据您收到的错误,您应该安装适当的编解码器。通过搜索“安装 libx264”按照在线说明进行操作。您将找到基于您使用的操作系统的特定信息。如果您遇到更多问题,请提供您的操作系统版本、到目前为止您已安装的软件列表以及您目前可能尝试过的内容。

于 2022-01-16T22:23:57.237 回答