为了连续性,让我们假设“ RGB值”如下:
typedef struct RGB {
uint8_t r, g, b;
} rgb;
但是,如果您认为其他颜色空间更适合此问题,请改用该颜色。
在继续之前,我应该指定希望能够在一个程序中全部完成这些操作。我正在尝试向应用程序中添加功能,以使其能够逐帧编译视频而不必离开。
此外,我对此功能的需求非常基础;我只需要能够将单个像素设置为某些颜色即可。
到目前为止,最接近解决方案的是C库FFmpeg。请允许我描述一下我自己可以学到的东西:
在仔细阅读了其文档之后,我遇到了函数avcodec_send_frame(avctx, frame)
,其参数分别为AVCodexContext*
和const AVFrame*
类型。 如果这些工具不适合我要执行的操作,请忽略其余的问题,而将我的使用指向我。
但是,我不知道必须手动设置avctx
和frame
的哪些字段,而不必手动设置。我认为某些原因不是因为两者都是非常大的结构,如果我错了,请纠正我。
问题1:必须设置AVCodecContext
和AVFrame
的哪些值?其中,每个的推荐值是多少?
此外,我只能找到有关如何初始化AVFrame
的说明(使用av_frame_alloc()
和av_frame_get_buffer()
),而找不到AVCodexConstant
的说明。
问题2:是否存在初始化AVCodexConstant
的正确方法?以防万一,上述初始化AVFrame
的方法是否正确?这两个字段中的任何一个都具有正确的初始化方法吗?
此外,我找不到有关如何使用此AVCodexConstant
(我认为其中包含视频信息)并将其转换为视频的官方文档。如果此文档很容易找到,我对此表示歉意。
问题3:如何将AVCodexConstant
转换为给定格式的文件?
而且,由于我的知识有限:
问题4:我在此过程中是否还有其他遗漏的地方,并且上述任何地方有误吗?
请记住,我是最近第一次了解FFmpeg,因此,我是一个完整的初学者。另外,我在C方面的经验非常有限,因此,如果您可以指出#include
中需要包含哪些文件,我将不胜感激。
随意推荐FFmpeg以外的其他东西,只要它是用C编写的。我不需要高级用户选项,但是我非常希望在音频和视频文件类型方面具有灵活性。库可以处理。
我对本节持续多久表示歉意;我只想掩盖我的基地。但是,如果这实际上是我无法找到的问题的重复,我深表歉意。
答案 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。但这不会有问题,因为您将在图片上使用与视频帧相同的格式。
希望这些帮助。