FFmpeg 4:使用stream_loop参数在视频播放结束时循环音频会导致无限循环

3

摘要

  1. 背景
  2. 我使用的软件
  3. 问题
  4. 结果
    4.1 实际结果

    4.2 预期结果

  5. 我为修复该错误尝试了什么?

  6. 如何重现此错误:提供所需数据的最小可测试示例

  7. 问题

  8. 来源


背景

我想将一个音频 WAV 设置为视频 WEBM 的背景音乐。视频可以比音频短或长。在添加音频到视频时,我不知道两个流的长度。音频必须重复直到视频结束(如果视频在音频的最后一次重复之前结束,则可以截断音频)。

我使用的软件

我使用的是 ffmpeg 版本 4.2.2-1ubuntu1~18.04.sav0。

问题

当 ffmpeg 处理混合音频和视频时,似乎会进入无限循环。此外,当前生成的输出文件(包含视频和音频)的长度等于音频的长度,而不是视频的长度。

这个命令行似乎触发了问题:

ffmpeg -i directory_1/video.webm -stream_loop -1 -fflags +shortest -max_interleave_delta 50000 -i directory_2/audio.wav directory_3/video_and_audio.webm

结果

实际结果

有三个问题:

  1. ffmpeg进程出现无限循环:我必须手动停止ffmpeg进程。

  2. 音乐输出视频文件(目前正在生成但已经输出):它包含音频和视频。但是,输出文件的长度等于音频的长度,而不是视频的长度。

  3. 以下输出日志:

ffmpeg 版本 4.2.2-1ubuntu1~18.04.sav0,版权所有 (c) 2000-2019 FFmpeg 开发者。使用 gcc 7 编译 (Ubuntu 7.5.0-3ubuntu1~18.04)。
配置: --prefix=/usr --extra-version='1ubuntu1~18.04.sav0' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100
从 'youtubed/my_youtube_video.webm' 输入: matroska,webm
Metadata:
encoder: Chrome
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0(eng): Video: vp8, yuv420p(progressive), 3200x1608 [SAR 1:1 DAR 400:201], 1k tbr, 1k tbn, 1k tbc (default)
Metadata:
alpha_mode: 1
输入流 #1.0 的通道布局猜测: stereo
从 "tmp_music/original_music.wav" 输入: wav
Duration: 00:00:11.78, bitrate: 1411 kb/s
#1:0 (pcm_s16le) -> #0:1 (libopus)
Stream mapping:
Stream #0:0 -> #0:0 (vp8(native) -> vp9(libvpx-vp9))
Stream #1:0 -> #0:1 (pcm_s16le(native) -> opus(libopus))
输出到 'youtubed/my_youtube_video_with_music.webm': webm 格式
Metadata:
encoder: Lavf58.29.100
Stream #0:0(eng): Video: vp9 (libvpx-vp9), yuv420p(progressive), 3200x1608 [SAR 1:1 DAR 400:201], q=-1--1, 200 kb/s, 1k fps, 1k tbn, 1k tbc (default)
Metadata:
alpha_mode:

预期结果

  1. ffmpeg过程中不出现无限循环

  2. 关于输出日志,我不知道它应该是什么样子。

  3. 包含音频和视频的输出文件应:

    3.1 如果视频比音频长,则将音频重复直到完全适合视频。可以截短音频。

    3.2 如果视频比音频短,则截短音频,以完全适合视频。

    3.3 如果视频和音频长度相同,则音频完全适合视频。

如何重现这个bug?(+ 必需数据)

  1. 下载以下文件(分别为音频和视频)(我必须每24小时刷新这些下载链接):

    1.1. https://a.uguu.se/dmgsmItjJMDq_audio.wav

    1.2. https://a.uguu.se/w3qHDlGq6mOW_video.webm

  2. 将它们移动到您选择的目录/目录中。

  3. 打开CLI,移动到适当的目录并复制/粘贴/执行Part. The Problem中给出的指令(不要忘记根据步骤2指定适当的目录来修改此指令)。

  4. 您将会面临我的问题。

我尝试修复这个bug了吗?

没有,因为我甚至不知道为什么会出现这个bug。

问题

如何更正我的命令,以便在ffmpeg过程中混合这些音频和视频流,而不会出现任何无限循环,并牢记它们的长度不可预知,并且即使必须截短音频文件(在最后一次重复音频文件必须截短,因为视频流刚刚结束的情况下),音频也必须重复以适合视频?

来源

源是您可以在部分。问题中找到的命令行。

1个回答

7
你的某些选项放置位置不正确。所有最短相关的选项都应该放在输出前面。
ffmpeg -i directory_1/video.webm -stream_loop -1 -i directory_2/audio.wav -c:v copy -shortest -fflags +shortest -max_interleave_delta 100M directory_3/video_and_audio.webm

除非你有需要,否则无需进行视频转码。


谢谢,它可以工作!为什么使用 -c:v copy?FFmpeg如何知道“shortest”参数与音频相关?为什么有两个“shortest”?^^ 另外,如果视频比音频短,那么音频会像预期的那样被截断吗?:-) - JarsOfJam-Scheduler
3
没有-c:v copy,视频将会重新压缩。没必要这样做。两个最短的标志针对ffmpeg的不同组件。是的,音频将被截断。 - Gyan
我不知道这个“-shortest -fflags +shortest”是什么玩意,但它确实解决了我的问题,之前只用“-shortest”是不行的。谢谢,伙计。 - JavaRunner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接