python - Python使用静态图像将mp3转换为mp4
问题描述
我确实有x
一个文件,其中包含一个mp3
文件列表,我想将每个mp3
文件转换为mp4
带有static
.png
照片的文件。
似乎这里唯一的方法是使用ffmpeg
但不知道如何实现它。
我制作了脚本来输入mp3
文件夹和一张.png
照片`。
然后它将创建新文件夹x-converted
,我想将每个文件夹转换mp3
为具有相同名称mp4
的静态文件,例如成为png
file1.mp3
file1.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()
解决方案
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 1
将input.png
输入帧速率设置为 1 fps。-map 0 -map 1:a
选择来自 的视频,image.png
并且只选择来自 的音频audio.mp3
。如果image.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 秒静音以获得解释。
推荐阅读
- python - 发送 dbus 命令时 Paramiko 的 exec_command 没有输出
- reactjs - eslint 抛出不存在的解析错误
- node.js - 如何在 node.js 中使用 node-geocoder 和代理?
- java - 我想部分选择一个 MySql 表行的内容
- bash - Azure CLI 中是否有类似于 bash 脚本中的 cat 的命令?GCP 的 gsutil 支持 cat 命令
- ms-access - Access 2019 - 保存的导入覆盖索引和字段选择设置
- python-3.x - 如何从数据框中获取值并将其存储为所有行的指定文本格式
- rust - 将 NonZeroUsize 包装在新类型中
- azure - 不满足使用 HTTP 条件标头指定的条件 Azure datalake gen2 using Python azure function
- javascript - Access-Control-Allow-Origin: 同源 & recaptcha & YouTube-视频