【发布时间】:2018-12-31 13:23:58
【问题描述】:
为了连续性,让我们假设“RGB值”如下:
typedef struct RGB {
uint8_t r, g, b;
} rgb;
但是,如果您觉得不同的色彩空间更适合这个问题,请改用它。
在给定输出格式和帧率的情况下,如何将 RGB 值的二维数组写入 C 语言的视频?
在继续之前,我应该说明我希望能够在一个程序中完成所有操作。我正在尝试向应用程序添加功能,使其能够逐帧编译视频而不必离开它。
此外,我对这个功能的需求非常基本;我只需要能够将单个像素设置为某些颜色。
到目前为止,我最接近的解决方案是 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 编写的。我不需要高级用户选项,但我更喜欢灵活的音频和视频文件类型图书馆可以处理。
解决潜在的重复问题
我很抱歉这部分有多长;我只想覆盖我的基地。但是,如果这实际上是我无法找到的问题的重复,我深表歉意。
- ffmpeg C API documentation/tutorial [closed] — 这个问题太开放了,收到的答案将提问者指向dranger.com 的教程,该教程通过重点关注所选图形库而混淆了水域。请不要认为这是我说的不好;我只是一个初学者,我无法全部通过。
- Encoding frames to video with ffmpeg — 虽然这个问题似乎一直在问同样的问题,但它是针对虚幻引擎 4 的,并且提问者提供了示例代码,这让我很难理解接受的答案的哪些部分对我来说是必要的,并且不是。
- How to write frames to a video file? — 虽然这也问了同样的问题,但接受的答案只是提供了一个命令而不是代码解释。
- YUV Raw frames to video stream — 虽然这个问题的公认答案是命令,但问题表明它正在寻找一种方法来编码由 C++ 代码生成的帧。有没有办法在我找不到的代码中运行命令?
- Converting sequenced frames to video — 提问者的代码不仅是用 Python 编写的,而且似乎还使用了已经存在的图像文件作为框架。
- How to write bitmaps as frames to H.264 with x264 in C\C++? — 接受的答案似乎描述了一个需要多个应用程序的过程,但我可能是错的,因为我已经足够初学者了,除了第 3 步之外我不确定它的确切含义。
- How to write bitmaps as frames to Ogg Theora in C\C++? — 虽然问题指定 ogg 格式不是问题,但接受的答案建议 libtheora 是一个问题,这似乎只适用于 ogg 文件。
【问题讨论】:
-
这里是一个ffmpeg API使用示例:muxing.c 可以看到
fill_yuv_image().中的AVFrame是如何填充的 -
@GalaDOS 不幸的是,该代码似乎使用了
avcodec_encode_audio2()和avcodec_encode_video2(),FFmpeg 官方文档称它们已被弃用,并已被avcodec_send_frame()取代,这是我在问题中提到的功能。看到可以使用data字段写入AVFrame是很有用的,但是代码向data写入任意值以产生“虚拟图像”,所以我无法收集除事实之外的任何内容使用data。不过,谢谢你分享。
标签: video encoding ffmpeg video-encoding