Video FFmpeg:如何使用C++;更改视频文件帧速率的代码?

Video FFmpeg:如何使用C++;更改视频文件帧速率的代码?,video,ffmpeg,Video,Ffmpeg,我知道使用FFmpeg命令更改视频文件的帧速率会更容易。 但不管怎样,如果我想用C++代码来做,使用FFMPEG库,我怎么办? 我想我应该能在源代码中找到线索。 在继续之前,我希望会有一些好的介绍或示例。这相当简单,您只需修改视频流的时基即可。对于简单的容器格式,如AVI,您只需要在标题中执行。如果您坚持通过ffmpeg API执行此操作,则需要循环输入流中的所有帧,并将它们复制到输出流 以上假设您只想更改FPS(即减慢或加快视频),而不丢弃帧。但是,如果要在更改FPS时保持视频播放的原始速度,

我知道使用FFmpeg命令更改视频文件的帧速率会更容易。 但不管怎样,如果我想用C++代码来做,使用FFMPEG库,我怎么办? 我想我应该能在源代码中找到线索。
在继续之前,我希望会有一些好的介绍或示例。

这相当简单,您只需修改视频流的时基即可。对于简单的容器格式,如AVI,您只需要在标题中执行。如果您坚持通过ffmpeg API执行此操作,则需要循环输入流中的所有帧,并将它们复制到输出流


以上假设您只想更改FPS(即减慢或加快视频),而不丢弃帧。但是,如果要在更改FPS时保持视频播放的原始速度,则需要重新编码视频,即在插入额外帧或删除某些帧时对每个帧进行解码和编码。您不能简单地从视频中删除帧-例如,当从30FPS转换为15FPS时,您不能简单地每2帧删除一帧,因为它可能是一个关键帧,并且它将打断它之后的所有帧,直到遇到下一个关键帧。同样,在提升FPS时不能简单地复制帧,因为P帧只应用于它之前的帧,因此复制它会破坏视频。对于这一点,我建议看一下我的卡拉OK歌词编辑器源代码,特别是和。

我想要的是你的第二个解释。播放速度相同,只是FPS有所变化。例如,原来的fps是20,我想改为30 fps。所以你的意思是我需要解码成帧,然后做一些插入(不是一个简单的算法)以获得每秒30帧的帧。将这些帧馈送到视频文件进行编码。但是,如果我想实时进行,我需要计算出需要解码多少帧,需要编码多少帧。那么,如何同步这两个过程呢?Android MediaCodec似乎使用EGL来帮助两者的同步。这相当容易。假设从20FPS上升到30FPS,这意味着每解码20帧,您需要添加10帧-因此每20/10=2帧,您需要添加一帧。所以你得到的计数器是从2到0,随着每一个编码帧的减少。一旦它达到零,您将再次对同一帧进行编码(当然是增加PTS),并再次将计数器设置为2。因此,源帧序列SSSS变成了SSDSSD,其中D是一个重复帧。感谢您的输入。虽然现在我不相信这个答案,但它是非常有帮助的;所以我投了赞成票。这是我的问题。我认为它将使用采样在特定时间点获得正确的帧。例如,在20 fps视频文件中,帧1、帧2、帧3处于:0/20sec、1/20sec、2/20sec。现在对于每秒30帧的视频文件,帧a、帧b、帧c应该是:0/30秒、1/30秒、2/30秒。所以对于1/30秒的帧,我们应该在0/20秒帧和1/20秒帧之间使用一些插值。我认为仅仅增加一个新的框架并不理想。