所以我仔细研究了一下 mp4 文件结构,发现它似乎有很多内容。据我了解,内容的布局如下。
video.mp4
├───general file metadata
├───movie data
├───tracks
│ ├───video
│ │ ├───video metadata
│ │ └───video sample data
│ └───audio
│ ├───audio metadata
│ └───audio sample data
└───more metadata
我想知道的是,我能否检测 mp4 中的“静音”部分?(不使用 ffmpeg 而仅使用文件结构)例如设置一个变量,表示“任何低于 20dB 的内容都被视为静音。文件结构内是否有块?如果有,它们以毫秒为单位有多大?如果这就是它的工作原理。
答案1
我可以检测 mp4 中的“静音”部分吗?
您可以使用ffmpeg
使用https://ffmpeg.org/使用过滤器检测静音silencedetect
:
检测音频流中的静音。
当此过滤器检测到输入音频音量小于或等于噪声容忍值,并且持续时间大于或等于检测到的最小噪声持续时间时,它会记录一条消息。
打印的时间和持续时间以秒为单位。
lavfi.silence_start
或lavfi.silence_start.X
元数据键设置在时间戳等于或超过检测持续时间的第一帧上,它包含静音第一帧的时间戳。
lavfi.silence_duration
或lavfi.silence_duration.X
和lavfi.silence_end
或元数据键lavfi.silence_end.X
在静音后的第一帧上设置。如果启用了单声道,并且分别评估每个通道,则.X
使用后缀键,X 对应于通道号。该过滤器接受以下选项:
noise, n
设置噪声容差。可以以 dB(如果指定值后附加“dB”)或振幅比为单位指定。默认值为 -60dB,或 0.001。持续时间,d
设置通知前的静默时长(默认为 2 秒)。请参阅(ffmpeg-utils)ffmpeg-utils(1)手册中的时间持续时间部分以获得可接受的语法。
mono, m
- 单独处理每个通道,而不是合并处理。默认情况下禁用。
8.103.1 示例
检测 5 秒的静默,噪声容差为 -50dB:
silencedetect=n=-50dB:d=5
使用 ffmpeg 的完整示例,在 silent.mp3 中检测具有 0.0001 噪声容忍度的静默:
ffmpeg -i silence.mp3 -af silencedetect=noise=0.0001 -f null -
来源:FFmpeg 过滤器文档
根据您的使用情况替换mp3
为适当的mp4
值。dB