我使用ffmpeg 的 MPEG4 解码器。解码器具有CODEC_CAP_DELAY 等功能。这意味着解码器将为我提供延迟为 1 帧的解码帧。
我有一组来自 AVI 文件的 MPEG4 (I- & P-) 帧,并将这些帧提供给 ffmpeg 解码器。对于第一个 I 帧解码器,我什么也没给,但成功解码了帧。我可以强制解码器通过avcodec_decode_video2的第二次调用获取解码的帧并提供空值(刷新它),但是如果我为每一帧这样做,我会得到第一组图片的伪影(例如,第二个解码的 P 帧是灰色)。
如果我现在不强制 ffmpeg 解码器给我解码的帧,那么它可以完美地工作并且没有伪影。
问题:但是是否有可能在不给解码器下一帧且没有伪影的情况下获得解码帧?
如何为每一帧实现解码的小例子:
// decode
int got_frame = 0;
int err = 0;
int tries = 5;
do
{
err = avcodec_decode_video2(m_CodecContext, m_Frame, &got_frame, &m_Packet);
/* some codecs, such as MPEG, transmit the I and P frame with a
latency of one frame. You must do the following to have a
chance to get the last frame of the video */
m_Packet.data = NULL;
m_Packet.size = 0;
--tries;
}
while (err >= 0 && got_frame == 0 && tries > 0);
Run Code Online (Sandbox Code Playgroud)
但正如我所说,这给了我第一个牧羊人的文物。
| 归档时间: |
|
| 查看次数: |
2863 次 |
| 最近记录: |