在做一个app时,需要在手机/平板端播放流媒体,这里就需要针对某视频的URL,mVideoView.setVideoUri(Uri.parse(SOME YOUTUBE VIDEO URL)); 这肯定不是通过直接youtube网上点击某视频所得的URL地址,需要hack一下,这部分在Youtube Data API里是找不到的,在StackOverflow上有一些英文资料,不过也都比较老,我总结修改了一些。
0. 保证通畅的VPN链接。
1. 通过Data API获取一批视频列表,得到视频的video_id
2. http://www.youtube.com/get_video_info?video_id= /*video_id*/获取该video_id的信息
3. 这一串String中,找到 fmt_list 与 url_encoded_fmt_stream_map,这两个项中的内容是相互对应的,最好通过split等手段转换为数组,转换成ArrayList或HashMap就更方便了。fmt_list需要URL decoder一下
4. 在 http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs 中取相对应的视频质量的value,由于我准备在平板上做,选取了18,mp4格式的视频
5. 得到fmt_list对应18的index,用这个index来获取url_encoded_fmt_stream_map中的值,再split一下,得到的第一位的String就是URL,这时还需要decoder一下。split的分隔符为&
我就是最后没有decoder,结果一直报错,返回一个MediaController -1004的错误
代码就不放了,自己调用一下API,看一下获取的String,对于hack url的理解和处理还是很有好处的。关键是用hack方法得到的结果是一大串String,需要好好处理下是挺有难度。
不能保证什么时候Google把这个方法封了,那就需要另外再找方法了。Google前几天刚刚放出了一个 android youtube play api,还没好好看过doc文档,高手可以看一下有没有比较clean的方法来实现
参考资料:
http://stackoverflow.com/questions/4397584/cant-download-from-youtube
http://stackoverflow.com/questions/3311795/youtube-video-download-url
http://stackoverflow.com/questions/1007695/streaming-youtube-videos
PS:我还没有实际在真机上测过,晚上试验一下再update
update:在解析到的视频地址后,还需加上"&signature=" + url_encoded_fmt_stream_map中的sig字段才可以