ffmpeg开发教程(5) : 使用SDL2 显示视频

上篇我们保存了视频的前500帧到硬盘中,本篇稍微修改下使用SDL2 显示视频,SDL2是个跨平台的用户界面软件包(支持音频,视频,键盘,鼠标以及游戏杆,3D图像显示)。

首先使用vcpkg install SDL2 下载安装SDL2软件包。

The package sdl2:x64-osx provides CMake targets:

    find_package(SDL2 CONFIG REQUIRED)
    target_link_libraries(main PRIVATE SDL2::SDL2 SDL2::SDL2main)

安装提示如何在CMake引用SDL2,因此我们修改下根CMakeList.txt, 添加对SDL2库的引用:

find_package(SDL2 CONFIG REQUIRED)

...
target_link_libraries(${TUTORIAL_TARGET} PRIVATE SDL2::SDL2 SDL2::SDL2main)

SDL2具体用法这里不介绍,基本用法如下:

// Make a screen to put our video
    screen = SDL_CreateWindow(
            "FFmpeg Tutorial02",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            pCodecContext->width,
            pCodecContext->height,
            0
    );

renderer = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);

// Allocate a place to put our YUV image on that screen
    texture = SDL_CreateTexture(
            renderer,
            SDL_PIXELFORMAT_YV12,
            SDL_TEXTUREACCESS_STREAMING,
            pCodecContext->width,
            pCodecContext->height
    );

...

首先创建Windows对象SDL_CreateWindow,然后创建Windows相应的渲染器。然后我们创建一个和视频大小相当的YUV格式的图像空间(Texture)。

有了这个Texture对象,我们使用直接使用SDL_UpdateYUVTexture,把解码后的AVFrame数据拷贝到这个Texture对象上:

SDL_UpdateYUVTexture(texture, NULL,
                                     pFrame->data[0], pFrame->linesize[0],
                                     pFrame->data[1], pFrame->linesize[1],
                                     pFrame->data[2], pFrame->linesize[2]);

然后使用渲染器(Render)显示图像到屏幕:

SDL_RenderClear(renderer);
                SDL_RenderCopy(renderer, texture, nullptr, nullptr);
                SDL_RenderPresent(renderer);

完整代码参见tutorialo2.cpp.

tutorial02 没有考虑显示的帧速,是按照能显示多快就显示多快来显示的,所以会给你感觉快进的效果。而且也没有考虑音频播放,以及音频和视频的同步的问题。
因为我后面的项目只处理视频,因此这部分方面本教程就不涉及了。