c++ - 如何从一系列快照中编码视频?

标签 c++ c video video-encoding

我与一种视频流接口(interface),这种视频流大约是每秒 30 帧的视频,大部分是静态的(如静止图片)。当视频中有移动时,我只会从流中获取更新。因此,如果视频有 5 分钟是静态的,我只会将这 5 分钟的数据作为单帧数据获取。然后,如果视频流上有 5 秒的移动,我也会获得这些帧的每个数据(例如,大约 150 帧)。然后,如果再静止 5 分钟,我将在整个时间内获得 1 个单帧数据。所以视频将是 10 分 5 秒,但我会在该时间段内获得 152 帧数据。

我正在尝试根据这些数据创建一个实时视频文件,但是当我对其进行编码时,视频的前 5 分钟和最后 5 分钟仅作为一个帧存在,因此它不是 5 分钟的静止视频,而是直接进入我拥有实际实时帧的 2 秒。

根据这些信息创建真实的全长/实时视频的最佳方法是什么?我目前正在使用 C++。

最佳答案

您没有提及任何有关编解码器或工具的内容,但暗示您已经在进行编码。

大多数视频编码器都需要固定的帧速率。因此,简单的解决方案是继续为它提供相同的帧,直到经过足够的“帧时间”以到达您的集合中的下一个静止画面。

这是一些伪代码:

frames_per_second = 30;
encoder  = CreateEncoder(frames_per_second, width, height);
milliseconds_per_frame = 1000.0/fps;
timestamp = frameset[0].timestamp;
x = 0;

while (x < frameset.count)
{
   AddNextFrameToEncoder(encoder, frameset[x].framedata);
   timestamp += milliseconds_per_frame;

   if ((x < frameset.count-1) && (timestamp >= frameset[x+1].timestamp))
   {
      x++;
   }
   // else - keep repeating the same source frame until "timestamp" is incremented to the timestamp of the next still
}

关于c++ - 如何从一系列快照中编码视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16388463/

相关文章:

c++ - 告诉 `endl` 不要刷新

c - Malloc 用于 void 指针数组的单个元素

ios - 保存自拍视频后视频的大小发生变化 swift 4

video - FFmpeg HLS 分段开始时间计算错误

c++ - c++中可修改的char数组类型是什么?

c++ - 打印所有给定N的偶数或奇数

c++ - clang 10 C++ 20概念如何为类方法指定复合要求?

c - BIO_new_mem_buf 未能创建 EVP_PKEY key ``

c - 为什么访问我的矩阵会出现段错误?

javascript - 有没有办法在客户端不安装任何插件的情况下在所有浏览器上播放 mkv 视频?