如何创建编码的AVPacket而不将帧发送到编码器?

问题描述 投票:0回答:1

我有一个 YUV_240 的 raw_pixels,我可以使用

avcodec_send_frame
将其提供给编码器,但是是否可以在不将其发送到编码器的情况下对原始 AVPacket 进行编码?

我需要它尽可能地并行编码,但只有当帧顺序正确并且我们无法将所有原始数据存储在内存中时才可能提供原始帧。

我检查了av_packet_from_data,但它需要已经编码的数据。

c++ c ffmpeg libavcodec
1个回答
0
投票

我不太清楚你想要实现什么。

如果您的像素数据已经编码(例如 GOP = 30,您应该有 1 个 I 帧和 29 个 B/P 帧),这是不可能的。请参阅下面的示例片段。

如果你的像素数据是完整的图片,那么在不编码的情况下写入它们没有任何意义,因为你的 GOP 大小将为 1 并且你将无法利用压缩。

这个例子只是配置了一个包。魔法是在“av_interleaved_write_frame”中完成的。

AVPacket* pPacket = av_packet_alloc();

pPacket->data = data;
pPacket->size = sizeOfData;
pPacket->stream_index = 0;
pPacket->dts = frameCounter;

if(isIFrame)
{
    m_avPacket->flags = AV_PKT_FLAG_KEY;
}

av_interleaved_write_frame(pAvFormatContext, pPacket)
av_packet_free(&pPacket);

注意:我刚刚使用简单的 AVI 和 H264 对此进行了测试。

© www.soinside.com 2019 - 2024. All rights reserved.