使用C库将帧编码为视频

时间:2018-07-24 02:59:02

标签: video encoding ffmpeg video-encoding

为了连续性,让我们假设“ RGB值”如下:

typedef struct RGB {
    uint8_t r, g, b;
} rgb;

但是,如果您认为其他颜色空间更适合此问题,请改用该颜色。

我应该如何在给定输出格式和帧率的情况下,以C语言将RGB值的2D数组写入视频?

在继续之前,我应该指定希望能够在一个程序中全部完成这些操作。我正在尝试向应用程序中添加功能,以使其能够逐帧编译视频而不必离开

此外,我对此功能的需求非常基础;我只需要能够将单个像素设置为某些颜色即可。

到目前为止,最接近解决方案的是C库FFmpeg。请允许我描述一下我自己可以学到的东西:

在仔细阅读了其文档之后,我遇到了函数avcodec_send_frame(avctx, frame),其参数分别为AVCodexContext*const AVFrame*类型。 如果这些工具不适合我要执行的操作,请忽略其余的问题,而将我的使用指向我。

但是,我不知道必须手动设置avctxframe的哪些字段,而不必手动设置。我认为某些原因不是因为两者都是非常大的结构,如果我错了,请纠正我。

问题1:必须设置AVCodecContextAVFrame的哪些值?其中,每个的推荐值是多少?

此外,我只能找到有关如何初始化AVFrame的说明(使用av_frame_alloc()av_frame_get_buffer()),而找不到AVCodexConstant的说明。

问题2:是否存在初始化AVCodexConstant的正确方法?以防万一,上述初始化AVFrame的方法是否正确?这两个字段中的任何一个都具有正确的初始化方法吗?

此外,我找不到有关如何使用此AVCodexConstant(我认为其中包含视频信息)并将其转换为视频的官方文档。如果此文档很容易找到,我对此表示歉意。

问题3:如何将AVCodexConstant转换为给定格式的文件?

而且,由于我的知识有限:

问题4:我在此过程中是否还有其他遗漏的地方,并且上述任何地方有误吗?


请记住,我是最近第一次了解FFmpeg,因此,我是一个完整的初学者。另外,我在C方面的经验非常有限,因此,如果您可以指出#include中需要包含哪些文件,我将不胜感激。

随意推荐FFmpeg以外的其他东西,只要它是用C编写的。我不需要高级用户选项,但是我非常希望在音频和视频文件类型方面具有灵活性。库可以处理。


解决潜在的重复

我对本节持续多久表示歉意;我只想掩盖我的基地。但是,如果这实际上是我无法找到的问题的重复,我深表歉意。

1 个答案:

答案 0 :(得分:0)

检查此工具bmdplay.cpp 这是专门为某些品牌PCI-E卡编写的linux工具。只需忽略卡的特定呼叫和功能即可。

它的main()函数具有问题1-4的答案。 并且其Player::ScheduleNextFrame()函数确实通过新的API对帧进行解码。

据我了解,您真正要问的是将(小)图片叠加到现有视频帧上。

几乎总是会发现视频文件使用YUV格式的视频帧。最多的命令之一是YUV420P。您可以将每个帧转换为RGB,然后对其进行处理,但这会产生额外的开销。因此最好使用本机格式。

关键是图片和视频帧应具有相同的格式。因此,您应该事先将图片转换为视频帧格式(我认为它是静态图片)。

RGB是线性格式,因此,如果您的源恰好是这种格式,只需编写一种算法即可将图片复制到视频帧。 (即AVFrame::data[0]

YUV420P是平面格式。 由3架飞机组成:
Y (AVFrame::data[0])
U (AVFrame::data[1])
V (AVFrame::data[2])
linesizes(也称为跨步)可以从(AVFrame::linesize[0-2])

获得

这种格式很复杂,U平面和V平面的Y帧大小为1/4。但这不会有问题,因为您将在图片上使用与视频帧相同的格式。

希望这些帮助。