在 ffmpeg filter-complex 中获取中间连接文件的长度

Get lengths of intermediate concatenated files in ffmpeg filter-complex

我正在编写一个媒体 Electron 应用程序,偶尔需要单独 trim => 单独规范化 => 连接 => 将不同数量的 WAV 文件转换为 MP3。 我已经成功地使用 FFMPEG(通过 Fluent-ffmpeg)来做到这一点(命令包装以提高可见性):

ffmpeg -i 3.301_to_8.752_Careful.wav -i 8.752_to_18.751_Careful.wav -y 
-filter_complex 
[0]silenceremove=start_periods=1:start_threshold=-50dB[mid];[mid]loudnorm=I=-16:TP=-1.5:LRA=11[out];
[1]silenceremove=start_periods=1:start_threshold=-50dB[mid];[mid]loudnorm=I=-16:TP=-1.5:LRA=11[b];
[out][b]concat=v=0:a=1[out]
 -b:a 128k -ac 1 -acodec libmp3lame -f mp3 -map [out] -y Careful_Merged.mp3

这是输出的相关部分:

Guessed Channel Layout for Input Stream #0.0 : mono
Input #0, wav, from '3.301_to_8.752_Careful.wav':
  Duration: 00:00:05.50, bitrate: 705 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono, s16, 705 kb/s
Guessed Channel Layout for Input Stream #1.0 : mono
Input #1, wav, from '8.752_to_18.751_Careful.wav':
  Duration: 00:00:10.30, bitrate: 705 kb/s
    Stream #1:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono, s16, 705 kb/s
Stream mapping:
  Stream #0:0 (pcm_s16le) -> silenceremove
  Stream #1:0 (pcm_s16le) -> silenceremove
  concat -> Stream #0:0 (libmp3lame)
Press [q] to stop, [?] for help
Output #0, mp3, to 'Careful_Merged.mp3':
  Metadata:
    TSSE            : Lavf58.28.101
    Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, mono, fltp, 128 kb/s (default)
    Metadata:
      encoder         : Lavc58.53.101 libmp3lame
size=     246kB time=00:00:15.69 bitrate= 128.4kbits/s speed=33.8x
video:0kB audio:246kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.170563%

好处是流程很好地链接起来,但缺点是我不知道在 automagic trim 之后中间文件的结果长度。我的应用程序需要 "table of contents" 显示每个片段的开始和结束,但我无法弄清楚如何在串联之前导出每个 trimmed 文件的持续时间 [0]silenceremove=start_periods=1:start_threshold=-50dB[mid];[mid]loudnorm=I=-16:TP=-1.5:LRA=11[out] 和串联 [out][b]concat=v=0:a=1[out]

它是如此优雅,我不想将中间文件保存到磁盘或 trim 两次音频以获取我需要的信息。我所需要的只是每个的持续时间,我可以计算。 有没有我可以内嵌的过滤器来导出中间持续时间,或者有什么方法可以获取串联操作的日志?

有什么想法吗?

如果您 运行 使用 -loglevel verbose-v 40 命令,concat 将记录段 EOF 事件,时间以微秒为单位,例如

[Parsed_concat_0 @ 00000000037e3440] EOF on in0:v0, 0 streams left in segment.
[Parsed_concat_0 @ 00000000037e3440] Segment finished at pts=5500000
[Parsed_concat_0 @ 00000000037e3440] EOF on in1:v0, 0 streams left in segment.
[Parsed_concat_0 @ 00000000037e3440] Segment finished at pts=6533333

第一段长 5.5s,第二段长 6533333 us - 5500000 us = 1.03s long。