【发布时间】:2015-12-24 00:58:15
【问题描述】:
我正在尝试播放我存档中的视频。播放正常,除了第一帧:got_picture_ptr 设置为 0。从第二帧开始一切正常。因此,在使用时间线搜索时,我无法检索图像。从归档功能发送和解码功能中的帧大小相同。为什么解码可能会失败?
AVPacket packet;
av_init_packet(&packet);
packet.data = (uint8_t*) frame->data;
packet.size = frame->size;
int decode_count = 0;
bool pushed = false;
// while(av_read_frame(formatContext, &packet) >= 0) {
//decode_ret = avcodec_decode_video2(codec_context, pFrame, &got_picture, &packet);
//}
LOGDEBUG("Frame len: %d", packet.size);
while (packet.size > 0) {
decode_count++;
int got_picture;
int decode_ret = 0;
// LOGDEBUG("Decoding [%d] (%d/%d, %d/%d) %d", getDecoderId(), codec_context->width, width, codec_context->height, height, packet.size);
try {
decode_ret = avcodec_decode_video2(codec_context, pFrame, &got_picture, &packet);
LOGDEBUG("Decoding frame size decode_ret: %d, got_picture: %d, width: %d, height: %d", decode_ret, got_picture, codec_context->width, codec_context->height);
decoded_frame_number = frame->index;
if (decode_ret < 0) {
LOGDEBUG("Decoding error %d", decode_ret);
return false;
}
} catch (...) {
LOGDEBUG("Error decoding");
return false;
}
if (packet.data) {
packet.size -= decode_ret;
packet.data += decode_ret;
}
if (!got_picture) {
LOGDEBUG("Waiting for full picture");
std::string packet_flags = "";
if (packet.flags & AV_PKT_FLAG_KEY) {
packet_flags += "AV_PKT_FLAG_KEY";
}
if (packet.flags & AV_PKT_FLAG_CORRUPT) {
packet_flags += " | AV_PKT_FLAG_CORRUPT";
}
// LOGDEBUG("Decoding %d frame[%ld] not complete (%d, %d) flags %s packetsize %d/%d keyframe %d for %d",
// decode_ret, frame->index, codec_context->width,
// codec_context->height, packet_flags.c_str(), packet.size, frame->size,
// pFrame->key_frame, decode_count);
continue;
}
这是我的全部功能:http://pastebin.com/TekkZEUa
附:解码第一帧后编解码器上下文宽度和高度为0。
【问题讨论】: