一、需求
现在有youtube视频播放链接(I),需要得到可以直接播放的视频链接(O)。
输入链接(I):
https://www.youtube.com/watch?v=xAsjRRMMg_Q
输出链接(O):
http://r14---sn-a5m7ln76.googlevideo.com/videoplayback?ip=199.231.215.246&key=yt5&expire=1425392524&mt=1425370849&mv=m&ms=au&sparams=cnrycms%2Cdur%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Cmime%2Cmm%2Cms%2Cmv%2Cpl%2Cratebypass%2Csource%2Cupn%2Cexpire&id=o-APmt7eobtj9jn-nwJYcAfq33J8Hdpa1kJ61DKySGOmbQ&upn=NS5UYm0pT40&dur=60.116&itag=22&pl=24&source=youtube&fexp=905657%2C907263%2C917000%2C927622%2C930811%2C936100%2C9406921%2C9407524%2C943917%2C947225%2C947240%2C948124%2C951703%2C952302%2C952612%2C952901%2C955301%2C957201%2C958504%2C959701&mime=video%2Fmp4&signature=30CDD93C439D1674F444A45E7C4ADD1838D229CA.91BE6B1991640088E635B379664F4E7EF3DF6662&mm=31&sver=3&ratebypass=yes&cnrycms=yes&ipbits=0&initcwndbps=13583750
因为开源播放器VLC中有播放youtube视频的相关实现,因此希望直接利用VLC实现youtube的视频解码。
二、分析
VLC版本:vlc-2.1.5。
VLC通过lua脚本实现youtube视频解码,具体文件是/vlc-2.1.5/share/lua/playlist/youtube.lua。
而youtube.lua的相关解析函数和结果由VLC的lua模块通过demux.c文件调用。
因此思路便是在VLC的入口函数/vlc-2.1.5/bin/vlc.c中引入输入链接,将其传递给youtube.lua和demux.c实现解析,然后将解析结果从demux.c传回入口函数vlc.c,从而获得我们需要的youtube视频播放链接。
三、实现
改动了VLC的4个文件
/vlc-2.1.5/share/lua/playlist/youtube.lua
/vlc-2.1.5/modules/lua/demux.c
/vlc-2.1.5/bin/vlc.c
/vlc-2.1.5/bin/Makefile
新添加了6个依赖软件包
lua-5.1.5
gmp-4.3.1
gnupg-2.0.26
nettle-2.7.1
gnutls-3.3.12
libgcrypt-1.6.2
四、流程
1、在VLC入口函数中添加输入链接,利用已有实例libvlc_instance_t *vlc,调用input_item_New 和 playlist_AddInput 将输入链接引入VLC;
2、VLC运行后,会在youtube.lua中得到视频链接的解析结果,将结果赋值给新添加的全局变量path_v;
3、在demux.c中利用C和lua混合编程提取出youtube.lua的path_v;
4、因为VLC的主线程与和demux模块分属不同的线程,因此在这里选择使用消息队列传递链接,在demux.c中建立消息队列,压入path_v值;
5、在vlc.c中使用与demux.c相同的消息队列获取path_v值,从而将最终结果返回至入口函数。
6、需要修改Makefile文件通过编译。