Python 用静态图像将 mp3 转换为 mp4

αԋɱ*_*cαη 3 python unix ffmpeg

我确实有x包含文件列表的文件mp3,我想将每个mp3文件转换为mp4带有static .png照片的文件。

似乎这里唯一的方法是使用ffmpeg,但不知道如何实现它。

我编写了脚本来输入mp3文件夹和一张.png照片。

然后它将创建新文件夹x-converted,我想将每个文件夹转换mp3为具有相同名称mp4的静态文件,例如成为pngfile1.mp3file1.mp4

这是我的代码:

import os
import sys
from pathlib import Path
import shutil

if len(sys.argv) != 3 or not sys.argv[2].endswith("png"):
    print("Make sure to provide two arguments only\nSecond arugment should be .png")
    exit()


def CheckFile():
    try:
        files = []
        for path in os.listdir(sys.argv[1]):
            full_path = os.path.join(sys.argv[1], path)
            if os.path.isfile(full_path):
                files.append(full_path)
        mp3 = [x for x in files if x.endswith(".mp3")]
        if len(mp3) >= 1:
            return mp3, sys.argv[2], sys.argv[1]
        else:
            print(
                "Make Sure That You've at least 1 Mp3 file")
            exit()
    except FileNotFoundError:
        print("Sorry, This File Is Not Exist!")
        exit()


def Convert():
    mp3, jpg, name = CheckFile()
    name = f"{Path(name).name}-converted"
    shutil.rmtree(name, ignore_errors=True)
    os.mkdir(name)
    os.chdir(name)
    # from here i don't know how to use `ffmpeg`


Convert()
Run Code Online (Sandbox Code Playgroud)

llo*_*gan 6

ffmpeg -loop 1 -framerate 1 -i image.png -i audio.mp3 -map 0:v -map 1:a -r 10 -vf "scale='iw-mod(iw,2)':'ih-mod(ih,2)',format=yuv420p" -movflags +faststart -shortest -fflags +shortest -max_interleave_delta 100M output.mp4
Run Code Online (Sandbox Code Playgroud)
  • -loop 1无限input.png循环。
  • -framerate 1将输入帧速率设置input.png为 1 fps。
  • -map 0 -map 1:a选择来自 的视频image.png且仅选择来自 的音频audio.mp3image.png如果小于 MP3 上附加的任何专辑/封面艺术,则需要这样做。否则,它可能会选择专辑/封面艺术。请参阅FFmpeg Wiki:地图了解更多信息。
  • -r 10将输出帧速率设置为 10 fps。将输入设置为 1 fps 并将输出设置为 10 fps 有两个原因:
    • 与最初将输入设置为 10 fps 相比,以 1 fps 输入并将帧复制到 10 fps 速度更快。它使编码速度更快。
    • 大多数玩家无法玩低于 6 fps 左右的游戏。10是一个安全值。
  • scale='iw-mod(iw,2)':'ih-mod(ih,2)'使用比例过滤器来确保输出宽度和高度都可以被 2 整除,这是某些编码器的要求。这允许您使用任何任意大小的图像作为输入。否则你可能会得到错误:width not divisible by 2
  • format=yuv420p 格式过滤器使输出使用 YUV 4:2:0 色度子采样以实现播放兼容性。
  • -movflags +faststart使视频开始播放得更快。
  • -shortest使得输出只要audio.mp3. 这是需要的,因为-loop 1已被使用。
  • -fflags +shortest -max_interleave_delta 100M-shortest由于 ffmpeg 的奇怪行为,在某些情况下与相关且需要。有关解释,请参阅我的 ffmpeg 输出总是在末尾添加额外的 30 秒静音。