如何快速获得任何音频文件的准确持续时间?
How to get an accurate duration of any audio file quickly?
有许多使用 VBR 编码的音频文件没有准确的持续时间标签,命令行 FFMpeg 将输出以下内容:
Estimating duration from bitrate, this may be inaccurate
(确实如此)
使用libav
,我们可以看到这是用libavformat/utils.c
中的has_duration()
函数测试的
我有一个音频播放器需要使用 libav
获取准确的持续时间信息。我已经尝试完全解码文件并计算解码样本的总数,这是通常的建议(并且是准确的),但是对于 60 分钟的音频文件,这可能需要 10 多秒,这是不可接受的。
我注意到有一些闭源音频解码器和音乐播放应用程序可以立即获得这些文件的准确持续时间。必须有一些廉价的方法来确定准确的持续时间吗?也许一个片段或高级描述可以帮助我。
可以非常快速地"demux"轨道并检查每个数据包的持续时间以确定轨道的总持续时间,不需要解码。
简单地在循环中添加持续时间直到到达 EOF:
int read = av_read_frame(pFormatCtx, packet);
durationSeconds = packet->duration * (double) timebase;
有许多使用 VBR 编码的音频文件没有准确的持续时间标签,命令行 FFMpeg 将输出以下内容:
Estimating duration from bitrate, this may be inaccurate
(确实如此)
使用libav
,我们可以看到这是用libavformat/utils.c
has_duration()
函数测试的
我有一个音频播放器需要使用 libav
获取准确的持续时间信息。我已经尝试完全解码文件并计算解码样本的总数,这是通常的建议(并且是准确的),但是对于 60 分钟的音频文件,这可能需要 10 多秒,这是不可接受的。
我注意到有一些闭源音频解码器和音乐播放应用程序可以立即获得这些文件的准确持续时间。必须有一些廉价的方法来确定准确的持续时间吗?也许一个片段或高级描述可以帮助我。
可以非常快速地"demux"轨道并检查每个数据包的持续时间以确定轨道的总持续时间,不需要解码。
简单地在循环中添加持续时间直到到达 EOF:
int read = av_read_frame(pFormatCtx, packet);
durationSeconds = packet->duration * (double) timebase;