使用 ffmpeg 转码时丢失数据包

问题描述

我在使用 opusffmpeg 转码为任何其他格式时遇到了非常奇怪的问题。我将它转码为 flac 为例,因为这是我目前使用的。

所以我有一个示例 opus 文件,它在通过 ffmpeg 处理后有点变短,就像 ffmpeg 会从中丢弃一些数据包/数据一样。

我不介意 ffmpeg 是否清理了一些多余的东西,但实际上这会使我的多个流的输出文件不同步,因此在某些时候音轨会相互重叠。

所以我有这个长度为 input.opus 的输入 00:00:05.78 文件,当我像这样通过 ffmpeg 时:

$ ffmpeg -i input.opus -c flac output.flac
ffmpeg version 4.3.1 copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10 (GCC)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection' --extra-ldflags='-Wl,-z,relro -Wl,--as-needed -Wl,Now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-liblensfun --enable-libmp3lame --enable-libmysofa --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librav1e --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-vulkan --enable-libglslang --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-lto --enable-libmfx --enable-runtime-cpudetect
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0,ogg,from 'input.opus':
  Duration: 00:00:05.78,start: -0.017500,bitrate: 48 kb/s
    Stream #0:0: Audio: opus,48000 Hz,mono,fltp
    Metadata:
      DURATION        : 00:00:05.836000000
      encoder         : Lavc58.91.100 opus
Stream mapping:
  Stream #0:0 -> #0:0 (opus (native) -> flac (native))
Press [q] to stop,[?] for help
[flac @ 0x55f94c9c2f40] encoding as 24 bits-per-sample
Output #0,flac,to 'output.flac':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Audio: flac,s32 (24 bit),128 kb/s
    Metadata:
      DURATION        : 00:00:05.836000000
      encoder         : Lavc58.91.100 flac
size=     393kB time=00:00:05.79 bitrate= 555.7kbits/s speed= 373x    
video:0kB audio:385kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.102753%

有趣的是,上面的 ffmpeg 显示输出应该得到 00:00:05.79 的持续时间,但是当用 ffprobe 检查它时,它缩短了约 50 毫秒:

$ ffprobe -hide_banner output.flac
Input #0,from 'output.flac':
  Metadata:
    encoder         : Lavf58.45.100
  Duration: 00:00:05.73,start: 0.000000,bitrate: 561 kb/s
    Stream #0:0: Audio: flac,s32 (24 bit)

这可能看起来很愚蠢的小差异,但我有意将文件缩短到 5 秒左右,以便更轻松地进行故障排除。源文件是大约 30 分钟,我在这个过程中丢失了大约 1 分钟,所以它是真实的

ffmpeg 4.3.1 版

我该如何解决这个问题?当我尝试使用 -loglevel trace 时,我注意到以下几个看起来“可疑”的日志:

[opus @ 0x555a5abe6c40] skip 0 / discard 192 samples due to side data
[opus @ 0x555a5abe6c40] discard 192/960 samples

但是还没有找到一种方法来阻止它丢弃这些样本(甚至不确定它是不是导致这种情况......)

我希望得到任何帮助或指出故障排除方向。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)