我正在编写一个媒体电子应用程序,该应用程序偶尔需要单独修剪=>单独归一化=>串联=>将不同数量的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%
好处是该过程可以很好地链接,但是缺点是我不知道自动修整后中间文件的最终长度。我的应用程序需要一个“目录”来显示每个段的开始和结束,但是我无法弄清楚如何在连接之间进行串联之前导出每个修剪文件的持续时间。
[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]
。
它是如此的优雅,我不希望将中间文件保存到磁盘或对音频进行两次修剪以获得我需要的信息。我所需要的只是每个课程的持续时间,我可以进行数学计算。 我可以插入一个过滤器以导出中间持续时间,还是一种获取串联操作日志的方法?
有什么想法吗?
答案 0 :(得分:0)
如果您使用-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。