Video 使用C库将帧编码为视频
为了保持连续性,我们假设“RGB值”如下:Video 使用C库将帧编码为视频,video,encoding,ffmpeg,video-encoding,Video,Encoding,Ffmpeg,Video Encoding,为了保持连续性,我们假设“RGB值”如下: typedef struct RGB { uint8_t r, g, b; } rgb; 但是,如果您觉得不同的颜色空间更适合此问题,请使用该颜色空间 在给定输出格式和帧率的情况下,如何将RGB值的2D数组写入C格式的视频? 在继续之前,我应该指定我希望能够在一个程序中完成这一切。我正在尝试向一个应用程序添加功能,使其能够在不必离开的情况下逐帧编译视频 此外,我对该功能的需求非常基本;我只需要能够将单个像素设置为特定的颜色 到目前为止,我最接
typedef struct RGB {
uint8_t r, g, b;
} rgb;
但是,如果您觉得不同的颜色空间更适合此问题,请使用该颜色空间
在给定输出格式和帧率的情况下,如何将RGB值的2D数组写入C格式的视频?
在继续之前,我应该指定我希望能够在一个程序中完成这一切。我正在尝试向一个应用程序添加功能,使其能够在不必离开的情况下逐帧编译视频
此外,我对该功能的需求非常基本;我只需要能够将单个像素设置为特定的颜色
到目前为止,我最接近的解决方案是C库。请允许我描述一下我自己能够学到的东西:
在浏览了它的文档之后,我发现了这个函数,它的参数类型分别为和如果这些工具不适合我尝试做的事情,请忽略问题的其余部分,而是告诉我应该使用什么。
但是,我不知道avctx
和frame
的哪些字段必须手动设置,哪些字段不需要手动设置。我认为有些不是因为它们都是非常大的结构,但如果我错了,请纠正我
问题1:必须设置AVCodecContext
和AVFrame
的哪些值?其中,每一项的建议值是多少
此外,我只能找到有关如何初始化AVFrame
(使用and)的说明,但找不到有关AVCodexConstant
的说明
问题2:是否有正确的方法初始化AVCodexConstant
?为了以防万一,上述初始化AVFrame
的方法正确吗?其中任何一个字段是否有正确的初始化方法
另外,我也找不到关于如何将这个AVCodexConstant
(我假设它包含视频信息)转换成视频的官方文档。我很抱歉,如果这个文档很容易找到,我只是错过了它
问题3:如何将AVCodexConstant
转换为给定格式的文件
鉴于我所知有限:
问题4:我是否遗漏了该流程的其他部分,以及上述部分是否有错误
请记住,我是最近第一次了解FFmpeg的,因此,我完全是这方面的初学者。此外,我对C的经验非常有限,如果您能注意到哪些文件需要包含在
#include
中,我将不胜感激
您可以随意推荐FFmpeg以外的内容,只要它是用C编写的。我不需要高级用户选项,但我更希望库能够灵活处理音频和视频文件类型
解决潜在的重复问题 我对这一部分的时间表示歉意;我只想把我的底子盖好。然而,如果这是我找不到的问题的重复,我深表歉意
- -这个问题太开放了,得到的答案指向了一个教程,该教程通过将重点放在所选的图形库上而令人困惑地搅乱了局面。请不要把这当作我说的不好;我只是一个初学者,不可能一劳永逸地完成这一切
- -尽管这个问题似乎一直在问同样的问题,但它针对的是虚幻的引擎4,询问者提供了示例代码,使我难以理解接受答案的哪些部分对我来说是必要的,哪些部分不是
- -虽然这也问了同样的问题,但接受的答案只是提供了一个命令,而不是对代码的解释 虽然这个问题的答案是一个命令,但问题是它正在寻找一种编码C++代码生成的帧的方法。有没有办法在我找不到的代码中运行命令
- -不仅asker的代码是用Python编写的,而且似乎还将现有的图像文件用作帧
- -被接受的答案似乎描述了一个需要多个应用程序的过程,但我可能是错的,因为我是一个初学者,除了步骤3之外,我不确定它到底意味着什么
- -虽然问题指定ogg格式不是问题,但公认的答案表明这是一个问题,似乎只适用于ogg文件
Player::ScheduleNextFrame()
函数通过新的API对帧进行解码
据我所知,你真正要求的是将一张(小)图片叠加到现有的视频帧上
几乎总是会发现视频文件使用YUV格式的视频帧。最常用的命令是YUV420P。您可以将每个帧转换为RGB,然后处理它,但这会增加额外的开销。所以最好使用本机格式
这里的关键是图片和视频帧应该有相同的格式。因此,您应该事先将图片转换为视频帧格式(我假设它是静止图片)
RGB是线性格式,所以如果您的源恰好是这种格式,只需编写一个算法将图片复制到视频帧。(即AVFrame::data[0]
)
YUV420P是平面格式。
由3个平面组成:Y(AVFrame::data[0])
U(AVFrame::data[1])
V