我正在编写一个音频扩展器来将音频从 24p 转换为 PAL 视频。24p 是 24000 / 1001 ~= 23.976 fps PAL 正好是 25 fps。
我使用的算法非常简单。如果“m”是输出样本数,“n”是输入样本数,则 m = floor(f(n + 0.5)),其中 f 是速度因子。在这种情况下 f = 25 / (24000 / 1001) = 1001 / 960 。是的,我基本上每 30 个左右的样本丢弃一次样本,但音频应该是同步的,而且你会听到大约 2kHz 的振铃。
但是,在生成的视频中,我在电影 1.5 小时后的 0.1 - 0.3 秒内可能失去了 a/v 同步。
我尝试通过使用长双精度而不是双精度来提高计算精度,但我得到了相同的音频偏移量。无论如何,只要你有 >9 sig figs,这不应该是一个因素,因为在 48kHz 采样的 2 小时电影中有 345 600 000 个样本。
我不认为我错过了一些神奇的同步数据,因为当我将原始视频拆分为视频和 wav 文件并将它们一起播放时,它们完全保持同步。
我意识到媒体容器/流可能不会将帧速率存储为有理数,即 24000 / 1001 ,(如果我错了,请纠正我!)他们会使用小数。如果是这样,我的加速因子不正确。
我尝试从各种播放器获取 fps:ffmpeg 23.98、vlc 23.976023。但我真的需要知道原始视频的确切帧率。从外观上看,它需要小数点后 5 位(0.2s / 2hrs)。我尝试插入 vlc 的 fps,但我仍然有点出局。
总而言之,有没有办法从 mp4 文件中提取准确的帧率?
或者我在这里错过了一些东西,比如让流保持同步的交错。
(代码在这里https://raw.github.com/rhlee/speed-alpha/22c28ddcb357649efd3dedd099e159ff024657fe/speed.c如果有人感兴趣的话。)