及对应的宽度和高度。SDL 会帮我们做好缩放,并能够使用 GPU 来使图像渲染更快。
SDL_Rect rect;
if (frameFinished) {
/* ... code ... */
// Convert the image into YUV format that SDL uses.
sws_scale(sws_ctx, (uint8_t const * const *)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pict.data, pict.linesize);
SDL_UnlockYUVOverlay(bmp);
rect.x = 0;
rect.y = 0;
rect.w = pCodecCtx->width;
rect.h = pCodecCtx->height;
SDL_DisplayYUVOverlay(bmp, &rect);
}
// Free the packet that was allocated by av_read_frame.
av_packet_unref(&packet);
到这里,我们的视频就可以显示了。
接下来,我们来看看 SDL 的另一个功能:事件系统。SDL 的事件系统使得你可以接收用户的输入,从而完成一些控制操作,在多线程编程时这个尤其有用。在这里,我们处理一个简单的 SDL_QUIT
事件,让我们可以退出程序。
SDL_Event event;
SDL_PollEvent(&event);
switch (event.type) {
case SDL_QUIT:
printf("SDL_QUIT\n");
SDL_Quit();
exit(0);
break;
default:
break;
}
以上便是我们这节教程的全部内容,其中的完整代码你可以从这里获得:https://github.com/samirchen/TestFFmpeg
编译执行
你可以使用下面的命令编译它:
$ gcc -o tutorial02 tutorial02.c -lavutil -lavformat -lavcodec -lswscale -lz -lm `sdl-config --cflags --libs`
找一个视频文件,你可以这样执行一下试试:
$ tutorial02 myvideofile.mp4