通过Fluent ffmpeg或ffmpeg从命令行转换到opus

通过Fluent ffmpeg或ffmpeg从命令行转换到opus,ffmpeg,Ffmpeg,我的目的是将webm文件转换为opus文件。 它的工作原理如下所示 ffmpeg -i input.webm -vn -c:a copy output.opus 但生成的opus文件总是从我播放它的第4秒或第5秒开始。似乎第一秒就消失了。知道为什么会这样吗 >ffmpeg -i x.webm -vn -c:a copy x1.opus ffmpeg version N-86175-g64ea4d1 Copyright (c) 2000-2017 the FFmpeg developer

我的目的是将webm文件转换为opus文件。 它的工作原理如下所示

ffmpeg -i input.webm -vn -c:a copy output.opus
但生成的opus文件总是从我播放它的第4秒或第5秒开始。似乎第一秒就消失了。知道为什么会这样吗

>ffmpeg -i x.webm -vn -c:a copy x1.opus
ffmpeg version N-86175-g64ea4d1 Copyright (c) 2000-2017 the FFmpeg 
developers
built with gcc 6.3.0 (GCC)
configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid -
-enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-
avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls 
--enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-
libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-
libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb -
-enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --
enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --
enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab -
-enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-
libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-
libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib
  libavutil      55. 63.100 / 55. 63.100
  libavcodec     57. 96.101 / 57. 96.101
  libavformat    57. 72.101 / 57. 72.101
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 90.100 /  6. 90.100
  libswscale      4.  7.101 /  4.  7.101
  libswresample   2.  8.100 /  2.  8.100
  libpostproc    54.  6.100 / 54.  6.100
Input #0, matroska,webm, from 'x.webm':
  Metadata:
  encoder         : libwebm-0.2.1.0
  creation_time   : 2017-06-19T20:50:21.722000Z
Duration: 00:00:32.33, start: 0.000000, bitrate: 134 kb/s
Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default)
Stream #0:1(eng): Video: vp8, yuv420p(progressive), 640x480, SAR 1:1 DAR 
4:3, 16.67 fps, 16.67 tbr, 1k tbn, 1k tbc (default)
Output #0, opus, to 'x1.opus':
Metadata:
encoder         : Lavf57.72.101
Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default)
Metadata:
  encoder         : Lavf57.72.101
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
size=     114kB time=00:00:32.33 bitrate=  28.8kbits/s speed=3.22e+003x
video:0kB audio:111kB subtitle:0kB other streams:0kB global headers:0kB 
muxing overhead: 2.152229%
它从0秒跳到4秒。 请看一下这个屏幕。

这是我尝试转码的示例视频文件:

所以我猜转码是从声音输入的那一点开始的,为什么

使用ffprobe,您可以看到视频流以0表示时间戳开始,而音频流以偏移量开始:

$ ffprobe sample.webm -loglevel error -select_streams v -show_packets -show_entries packet=pts_time -of compact=p=0:nk=1 | head
0.000000
0.064000
0.112000
0.176000
0.240000
0.304000
0.353000
0.417000
0.481000
0.545000

$ ffprobe sample.webm -loglevel error -select_streams a -show_packets -show_entries packet=pts_time -of compact=p=0:nk=1 | head
2.495000
2.515000
2.535000
2.555000
2.575000
2.595000
2.615000
2.635000
2.655000
2.675000
这就是为什么当您仅播放音频流时,播放头会指示不同的时间,因为这些时间戳会复制到output.opus文件中


我不知道如何在不重新编码输出(而不是流复制)的情况下将它们设置为零,但这应该会给您一个指针,告诉您出了什么问题。

显示完整的控制台输出。@Mulvya,添加了它。输出持续时间与输入持续时间相同–您只听到无声音频吗?它是只发生在这个特定的文件中,还是也发生在其他文件中?你有一个显示这个问题的示例文件吗?没有。它从0秒跳到4秒。请看一下这个屏幕。这是一个示例视频文件:我想转码是从语音输入的那一点开始的,为什么?我的所有文件都会发生这种情况。@slhck,有什么想法吗?@slchk,因此它表明输入视频文件的纯音频文件是以这种方式存在的,这意味着我们可以使用它,但有一个偏移量;这是因为输入视频文件的生成方式。是的,这个偏移量是由于时间戳写入输入文件的方式造成的。