【问题标题】:Python convert mp3 to mp4 with static imagePython使用静态图像将mp3转换为mp4
【发布时间】:2020-10-16 02:19:16
【问题描述】:

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

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

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

然后它将创建新文件夹x-converted,我想将每个mp3 转换为mp4,其中静态png 具有同名,例如file1.mp3 成为@ 987654335@

这是我的代码:

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()

【问题讨论】:

  • @llogan 只是 ffmpeg 部分。
  • @llogan 我已经查看了您的个人资料,似乎您对ffmpeg 非常了解。希望你能帮助我。提前致谢。

标签: python unix ffmpeg


【解决方案1】:
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
  • -loop 1 使 input.png 无限循环。
  • -framerate 1input.png 输入帧速率设置为 1 fps。
  • -map 0 -map 1:aimage.png 中选择视频,并且仅从 audio.mp3 中选择音频。如果image.png 小于附加到 MP3 的任何专辑/封面艺术,则需要这样做。否则,它可能会选择专辑/封面艺术。请参阅FFmpeg Wiki: Map 了解更多信息。
  • -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)' 使用 scale filter 确保输出宽度和高度都可以被 2 整除,这是某些编码器的要求。这允许您使用任意大小的图像作为输入。否则会报错:width not divisible by 2
  • format=yuv420p format filter 使输出使用 YUV 4:2:0 色度二次采样以实现播放兼容性。
  • -movflags +faststart 使视频开始播放更快。
  • -shortest 使输出与 audio.mp3 一样长。这是必需的,因为使用了 -loop 1
  • -fflags +shortest -max_interleave_delta 100M-shortest 相关,在某些情况下由于 ffmpeg 的奇怪行为而需要。有关说明,请参阅 My ffmpeg output always add extra 30s of silence at the end

【讨论】:

  • 非常感谢。这样的答案确实应该在文档中。这是我找到的最好的解释答案
  • 如果你不介意检查一下,因为我注意到视频的长度变长了。那是original,在converting之后。我使用了与您解释的相同的命令,没有进行任何编辑。
  • @αԋɱҽԃαмєяιcαη 查看更新的答案(最后一个要点)。顺便说一句,视频不错。
【解决方案2】:

ffmpy & ffmpeg-python 等库可以让你用python操作ffmpeg,试试这些。 (我很久以前用过ffmpeg-python,效果很好)

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 2019-07-31
    • 2012-04-20
    • 2014-11-04
    • 2013-09-24
    • 1970-01-01
    • 2016-08-03
    • 2019-01-12
    • 2020-08-10
    相关资源
    最近更新 更多