问题描述
我在使用 opus
将 ffmpeg
转码为任何其他格式时遇到了非常奇怪的问题。我将它转码为 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 (将#修改为@)