vlc-video解码后的输出路径

做播放器类的app开发,有很多的多媒体框架可以选择,vlc就是其中之一,其他的比如ijkplayer vitamio等,总的来说他们的功能都是一致的,即音视频文件的解复用,解码,这些功能被封装成java sdk,简化app开发人员的调用。 现在有个疑问,如果是使用android系统提供的 mediaplayer进行播放,最终解码出来的yuv数据流可以知道mediaplayer内部给到surface 输出了,那这些第三方的框架自己解码出来的 yuv数据,怎么配合输出到android显示呢? 也就是说使用了那些android系统提供的接受 yuv数据播放的接口?所以这里从vlc源码来分析下,vlc 解码后的yuv video数据输出到哪里去了。同样 音频解码后的输出,在我之前的一篇博客中有分析:https://blog.csdn.net/u012459903/article/details/103727581
vlc 3.0.6源码, 从源码 /input/decoder.c  的函数 DecoderPlayVideo() ,即解码完后输出video到 video ouput设备,在vlc_vout.h中有介绍 struct vout_thread_t 结构体,其中包含的 struct vout_thread_sys_t,这个就是所有video输出模块应该实现对接的一个结构体,vlc模块化的结构,  在src/videoout/video_output.c  中:

static vout_thread_t *VoutCreate(vlc_object_t *object,
                                 const vout_configuration_t *cfg)
{
    video_format_t original;
    if (VoutValidateFormat(&original, cfg->fmt))
        return NULL;
    /* Allocate descriptor */
    vout_thread_t *vout = vlc_custom_create(object,
                                            sizeof(*vout) + sizeof(*vout->p),
                                            "video output");
}

创建"video output" 能力的module.
所以下面就按照这个struct vout_thread_sys_t结构体在全工程中查找video out模块了。也可以通过“video output” 关键字来查找。每一个video out模块都有应该有类似如下:

vlc_module_begin()
 ...
    set_capability("vout display", /*10*/0)
 ...
vlc_module_end()

这样的模块描述。
1.0 Aa.c : "vout display" module using aalib
2.0 caca.c: Color ASCII Art "vout display" module using libcaca
3.0 clone.c : Clone video plugin for vlc  只是克隆出来另一份
4.0 decklink.cpp: BlackMagic DeckLink SDI输出模块
5.0 direct3d11.c: Windows Direct3D11 video output module
6.0  direct3d9.c: Windows Direct3D9 video output module
7.0 directdraw.c: Windows DirectDraw video output
8.0 modulse/hw/vpdau/display.c : VDPAU is the Video Decode and Presentation API for UNIX. It provides an interface to video decode acceleration and presentation hardware present in modern GPUs   gpu显卡接口
9.0 modules/video_outpu/android/display.c  android 的video输出,这就是我要找的,可以看到对应子目录 /module/video_output/android/:   文件 utils.h :终于使用到了 android的接口。这个部分怎么使用还得单独研究研究
10.0 modules/video_output/opengl/display.c  openGL接口,android也支持opengGL
11.0 evas.c  : EFL Evas video output https://www.enlightenment.org/  Enlightenment Foundation Libraries, or EFL, are the set of libraries used to create the Enlightenment Window Manager DR17 (E17) 不知道是什么时候的产物,好冷门的样子
12.0 fb.c :framebuffer plugin linux基于framebuffer设备的输出
13.0 flaschentaschen.c: Flaschen-Taschen video output display for vlc cf. https://github.com/hzeller/flaschen-taschen
不认识,好像树莓派有关
14.0 glwin32.c: Windows OpenGL provider
15.0 kva.c: KVA video output plugin 
16.0 shm.c Wayland shared memory video output module for VLC media player 共享内存的方式输出给其他程序使用
17.0 vdummy.c: Dummy video output display method for testing purposes dump输出调试使用
18.0 vmem.c: memory video driver for vlc
19.0 modules/codec/omxil/vout.c :OpenMAX IL video output  输出给openmax
20.0 mmal.c: MMAL-based vout plugin for Raspberry Pi
21.0 wingdi.c : Win32 / WinCE GDI video output plugin for vlc
22.0 x11.c X C Bindings video output module for VLC media player
23.0 xvideo.c X C Bindings video output module for VLC media player
24.0 yuv.c : yuv video output 输出yuv流到文件,或者设备文件
从这些moudle来看,video输出到android,一个途径是使用了android的nativewindow, 另一个就是走opengGL

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章