我有x
文件包含一个列表mp3
我想转换的文件mp3
文件至mp4
文件带有static
.png
photo.
似乎这里唯一的方法是使用ffmpeg
但我不知道如何实现它。
我编写了脚本来接受输入mp3
文件夹和一个.png
photo`.
然后它将创建新文件夹x-converted
我想在哪里转换每个mp3
to mp4
与静电png
with 一样的名字例如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
makes input.png
无限循环。
-
-framerate 1
sets input.png
输入帧速率为 1 fps。
-
-map 0 -map 1:a
从以下位置选择视频image.png
并且只有来自的音频audio.mp3
。这是需要的情况image.png
比 MP3 上附加的任何专辑/封面都小。否则,它可能会选择专辑/封面艺术。看FFmpeg 维基:地图 https://trac.ffmpeg.org/wiki/Map了解更多信息。
-
-r 10
sets output frame rate to 10 fps. Setting input to 1 fps and output to 10 fps is for two reasons:
- 与最初将输入设置为 10 fps 相比,以 1 fps 输入并将帧复制到 10 fps 速度更快。它使编码速度更快。
- 大多数玩家无法玩低于 6 fps 左右的游戏。 10是一个安全值。
-
scale='iw-mod(iw,2)':'ih-mod(ih,2)'
uses 水垢过滤器 https://ffmpeg.org/ffmpeg-filters.html#scale确保输出宽度和高度都能被 2 整除,这是某些编码器的要求。这允许您使用任何任意大小的图像作为输入。否则你可能会得到错误:width not divisible by 2
.
-
format=yuv420p
格式过滤器 https://ffmpeg.org/ffmpeg-filters.html#format使输出使用 YUV 4:2:0 色度子采样以实现播放兼容性。
-
-movflags +faststart
使视频开始播放得更快。
-
-shortest
使输出只要audio.mp3
。这是需要的,因为-loop 1
被使用了。
-
-fflags +shortest -max_interleave_delta 100M
相关-shortest
在某些情况下由于 ffmpeg 的奇怪行为而需要。看我的 ffmpeg 输出总是在最后添加额外的 30 秒静音 https://stackoverflow.com/a/55804507/以获得解释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)