代码如下:实际运行中 收到的frame队列pts顺序正确 LOG打印也没有问题,但是SDL的窗口一直是黑屏状态,不知道如何排查问题。请各位看看。
void VideoPlay::play_video() {
while (is_running_) {
refresh_loop_wait_event(&event_);
switch (event_.type) {
case SDL_KEYDOWN:
if (event_.key.keysym.sym == SDLK_q) {
LOG_INFO("Q quit");
is_running_ = false;
frame_queue_->abort();
}
break;
case SDL_QUIT:
LOG_INFO("SDL_QUIT");
is_running_ = false;
frame_queue_->abort();
break;
default:
break;
}
}
}
void VideoPlay::refresh_loop_wait_event(SDL_Event *event) {
SDL_PumpEvents();
while (
!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {
video_refresh();
SDL_PumpEvents();
}
}
void VideoPlay::video_refresh() {
int ret = 0;
frame_queue_->pop(frame_);
if (!frame_) {
LOG_ERROR("frame_queue_ pop failed.");
is_running_ = false;
frame_queue_->abort();
return;
}
rect_.x = 0;
rect_.y = 0;
rect_.w = video_width_;
rect_.h = video_height_;
ret = SDL_UpdateYUVTexture(
texture_, &rect_, frame_->data[0], frame_->linesize[0], frame_->data[1],
frame_->linesize[1], frame_->data[2], frame_->linesize[2]);
LOG_DEBUG("frame pts: %ld, tot size: %d, Y size: %d, U size: %d, V size: %d",
frame_->pts, video_width_ * video_height_, frame_->linesize[0],
frame_->linesize[1], frame_->linesize[2]);
if (ret != 0) {
LOG_ERROR("SDL_UpdateYUVTexture failed. %s", SDL_GetError());
is_running_ = false;
frame_queue_->abort();
return;
}
ret = SDL_RenderClear(renderer_);
if (ret != 0) {
LOG_ERROR("SDL_RenderClear failed. %s", SDL_GetError());
is_running_ = false;
frame_queue_->abort();
return;
}
ret = SDL_RenderCopy(renderer_, texture_, nullptr, &rect_);
if (ret != 0) {
LOG_ERROR("SDL_RenderCopy failed. %s", SDL_GetError());
is_running_ = false;
frame_queue_->abort();
return;
}
SDL_RenderPresent(renderer_);
SDL_Delay(10);
av_frame_free(&frame_);
frame_ = nullptr;
}
