如何使用ffmpeg-python将帧序列叠加到视频上?
问题:FFmpeg叠加PNG帧序列无显示,且生成带透明背景视频失败
问题概述
- 尝试用FFmpeg将PNG帧序列叠加到背景视频,最终仅显示背景视频
- 将帧序列合并为.webm/.mov/.avi格式时,透明度丢失,视频背景变为黑色
- 帧尺寸与背景视频一致,无需缩放
叠加视频的尝试代码
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)
补充尝试与现象
单张PNG叠加测试
先尝试使用单张PNG图片
overlay_video = ffmpeg.input('test-frame.png')
- 普通PNG图片叠加有效,但OpenCV生成的帧无效
- 手动查看OpenCV生成的帧显示为空白,但用以下代码转成视频能正常显示绘制内容:
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()
直接生成帧序列视频
尝试不叠加,直接用所有PNG图片生成视频
- 视频内容正常,但透明度丢失,背景变黑;测试.webm/.mov/.avi格式均无法保留透明度
FFmpeg日志信息
添加.global_args('-report')并查看日志文件
Report written to "ffmpeg-20221119-110731.log" Log level: 48 ffmpeg version 5.1 Copyright (c) 2000-2022 the FFmpeg developers built with Apple clang version 13.1.6 (clang-1316.0.21.2.5) configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon libavutil 57. 28.100 / 57. 28.100 libavcodec 59. 37.100 / 59. 37.100 libavformat 59. 27.100 / 59. 27.100 libavdevice 59. 7.100 / 59. 7.100 libavfilter 8. 44.100 / 8. 44.100 libswscale 6. 7.100 / 6. 7.100 libswresample 4. 7.100 / 4. 7.100 libpostproc 56. 6.100 / 56. 6.100 Input #0, image2, from './frames/*.png': Duration: 00:00:05.00, start: 0.000000, bitrate: N/A Stream #0:0: Video: png, rgba(pc), 1920x1080, 25 fps, 25 tbr, 25 tbn Codec AVOption crf (Select the quality for constant quality mode) specified for output file #0 (movie.avi) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream. Codec AVOption preset (Configuration preset) specified for output file #0 (movie.avi) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream. Stream mapping: Stream #0:0 -> #0:0 (png (native) -> mpeg4 (native)) Press [q] to stop, [?] for help Output #0, avi, to 'movie.avi': Metadata: ISFT : Lavf59.27.100 Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p(tv, progressive), 1920x1080, q=2-31, 200 kb/s, 25 fps, 25 tbn Metadata: encoder : Lavc59.37.100 mpeg4 Side data: cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A frame= 125 fps= 85 q=31.0 Lsize= 491kB time=00:00:05.00 bitrate= 804.3kbits/s speed=3.39x video:482kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.772174%
OpenCV生成帧的代码
for i in range(num_frames): transparent_img = np.zeros((height, width, 4), dtype=np.uint8) cv2.line(transparent_img, (x1,y1), (x2,y2) ,(255, 255, 255), thickness=1, lineType=cv2.LINE_AA) self.frames.append(transparent_img) ## 将视频的每一帧保存到指定文件夹 for i, f in enumerate(frames): cv2.imwrite("{}/{:0{n}d}.png".format(path_to_frames, i, n=num_digits), f)
内容的提问来源于stack exchange,提问作者Yogesh Yadav
相关产品推荐
相关产品推荐

