我正在编写音频担架,将音频从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。
但是,在拍摄的视频中,我在电影中播放时间大约为0.1 - 0.3秒,而且还没有同步。
我尝试使用长双精度而不是双精度来提高计算精度,但我得到了相同的音频偏移。无论如何,这不应该是一个因素,只要你有> 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。)