我当时正在开发一个YouTube 视频下载器Python 程序。
我想将下载的数据编码为其他媒体格式,为此我使用了FFmpeg和FFmpeg-Python(在 Python 中使用 FFmpeg 的包)。
一切都很好,但我想问如何在控制台上禁用FFmpeg 输出?
这是我的程序的一些图片:-
但是当我的程序开始编码时,这个控制台经常出现,抑制主 GUI :-
如果您知道我的问题的任何解决方案,请给我一些解决方案。这是我第一次尝试使用 Stackoverflow 来解决我的问题。
提前致谢 !!!!!
我在下面尝试过,但它只显示背景视频。
background_video = ffmpeg.input( "input.mp4")
overlay_video = ffmpeg.input(f'{frames_folder}*.png', pattern_type='glob', framerate=25)
subprocess = ffmpeg.overlay(
background_video,
overlay_video,
).filter("setsar", sar=1)
Run Code Online (Sandbox Code Playgroud)
我还尝试将帧序列组装成 .webm/.mov 视频,但透明度丢失。视频以黑色为背景。
PS - 帧大小与背景视频大小相同。所以不需要缩放。
我尝试了@Rotem的建议
首先尝试使用单个 PNG 图像
overlay_video = ffmpeg.input('test-frame.png')
Run Code Online (Sandbox Code Playgroud)
它不适用于 OpenCV 生成的帧,但适用于任何其他 png 图像。这很奇怪,当我手动查看这些框架文件夹时,它显示空白图像(链接到我的框架文件夹)。但是,如果我将这些帧转换为视频(见下文),它会正确显示我在每个帧上绘制的内容。
output_options = {
'crf': 20,
'preset': 'slower',
'movflags': 'faststart',
'pix_fmt': 'yuv420p'
}
ffmpeg.input(f'{frames_folder}*.png', pattern_type='glob', framerate=25 , reinit_filter=0).output(
'movie.avi',
**output_options
).global_args('-report').run()
Run Code Online (Sandbox Code Playgroud)
尝试从所有 PNG 图像创建视频而不叠加
它按预期工作,唯一的问题是透明度。有没有办法制作透明背景视频?我尝试了 .webm/.mov/.avi 但没有运气。
添加 .global_args('-report') 并检查日志文件
Report written to "ffmpeg-20221119-110731.log"
Log level: 48
ffmpeg version 5.1 Copyright (c) 2000-2022 …Run Code Online (Sandbox Code Playgroud) 我想用 ffmpeg-python 模仿以下 ffmpeg 命令
ffmpeg -y -i in.mp4 -t 30 -filter_complex "fps=10,scale=-1:-1:flags=lanczos[x];[0:v]palettegen[y];[x][y]paletteuse" out.gif
到目前为止,这就是我所得到的:
in_stream = ffmpeg.input(src, ss=start_time, t=(stop_time-start_time))
scale_input = in_stream
if fps >= 1:
stream = ffmpeg.filter(in_stream['v'], 'fps', fps)
scale_input = stream
stream = ffmpeg.filter(scale_input, 'scale', output_width, output_height, 'lanczos')
palette = ffmpeg.filter(in_stream['v'], 'palettegen')
#stream = ffmpeg.filter(stream, palette, 'paletteuse') ???
stream.output(dst).run()
Run Code Online (Sandbox Code Playgroud)
我检查过,如果我将其输出为 png,调色板会生成得很好。但是,我找不到如何通过多输入命令使用它paletteuse,因为过滤器仅将一个流作为 ffmpeg-python 的输入。我尝试将它们连接起来,ffmpeg.concat()这是我发现的从两个流中创建一个流的唯一方法,但我认为这是没有意义的(而且无论如何它都不起作用)。
任何想法?
我使用 ffmpeg-python 进行一些视频转换。
如果我有以下情况:
infiles = []
infile = ffmpeg.input("/tmp/xxx.mp4")
infiles.append(
infile['v']
.filter('scale', size='1920x1080', force_original_aspect_ratio='decrease')
.filter('pad', '1920', '1080', '(ow-iw)/2', '(oh-ih)/2')
)
infiles.append(infile['a'])
(
ffmpeg
.concat(
*infiles, v=1, a=1, unsafe=True)
.output(out_tmp_file)
.run()
)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下错误:
Stream specifier ':a' in filtergraph description [0:v]scale=force_original_aspect_ratio=decrease:size=1920x1080[s0];[s0]pad=1920:1080:(ow-iw)/2:(oh-ih)/2[s1];[s1][0:a]concat=a=1:n=1:unsafe=True:v=1[s2] matches no streams.
Run Code Online (Sandbox Code Playgroud)
如果视频有音频,以上方法有效
我有这个命令行代码:
ffmpeg -i 0.mp4 -c:v libx265 -preset fast -crf 28 -tag:v hvc1 -c:a aac -bitexact -map_metadata -1 out.mkv
Run Code Online (Sandbox Code Playgroud)
我想将它转换为Python中的ffmpeg-python代码。
但我该怎么办呢?
这是我到目前为止所做的:
import ffmpeg
(
ffmpeg
.input('0.mp4')
.filter('fps', fps=30)
.output('out.mkv', vcodec='libx265', crf=28, preset='fast', movflags='faststart', pix_fmt='yuv420p')
.run()
)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 ffmpeg-python 将多个字幕(未刻录)添加到视频文件中。我有这个 ffmpeg 命令:
ffmpeg -i input.mp4 -f srt \
-i "subs/en/en_srt_sub.srt" \
-i "subs/fr/fr_srt_sub" \
-map 0:0 -map 0:1 -map 1:0 -map 2:0 \
-c:v copy -c:a copy \
-c:s srt -c:s srt \
-metadata:s:s:0 language=en -metadata:s:s:0 title=English \
-metadata:s:s:1 language=fr -metadata:s:s:1 title=French \
output.mkv
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 ffmpeg-python 模块来做到这一点,或者我只需要使用字符串格式化和子进程。