LifeActor / ykdl

a video downloader focus on China mainland video sites.(一款专注于中国大陆视频网站的视频下载器。)
https://github.com/LifeActor/ykdl
Other
1.45k stars 285 forks source link

测试结果显示load_m3u8返回的urls并不是按照视频时间的先后顺序排列的 #89

Closed redstoneleo closed 7 years ago

redstoneleo commented 7 years ago

根据我用 http://www.le.com/ptv/vplay/1849553.html?ch=baidu_ald 的测试结果显示ykdl里的load_m3u8返回的urls并不是按照视频时间的先后顺序排列的,而我希望获得一个m3u8文件里所有的视频片段列表(按照视频时间的先后顺序排列出来),请问有没有什么方法?单纯对m3u8文件里所有的视频片段的url排序也不管用啊,希望各位多多指教!

这个问题看似和ykdl无关,但是我正在做ykdl的GUI,请各位宽容!

                def load_m3u8(url):
                    urls = []
                    m =  m3u8.load(url)
                    for seg in m.segments:
                        urls.append(seg.absolute_uri)
                    return urls
zhangn1985 commented 7 years ago

为什么会不安时间顺序呢?

redstoneleo commented 7 years ago

这个我也不太懂。 我原本的意思是根据url的返回顺序让每一个url对应一个视频文件名为“视频名称_n”(n是从1开始的自然数),以便最终下完所有视频片段的时候再排序合并视频。 现在因为没有按照视频时间的先后顺序排列返回urls,所以按照这种方法无法前进了

zhangn1985 commented 7 years ago

为什么没有安时间顺序返回urls呢?

zhangn1985 commented 7 years ago

你把解密的m3u8文件的头部贴出来。

zhangn1985 commented 7 years ago

除非有EXT-X-DISCONTINUITY这个标记,那么视频分段可能是时间不连续的。 至于这种怎么处理,得问https://github.com/globocom/m3u8 ref: https://tools.ietf.org/html/draft-pantos-http-live-streaming-06#page-10

redstoneleo commented 7 years ago

没有EXT-X-DISCONTINUITY,难道是其他地方出问题了

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-MEDIA-SEQUENCE:0

#EXT-X-ALLOW-CACHE:YES

#EXT-X-TARGETDURATION:20

#EXT-LETV-M3U8-TYPE:VOD

#EXT-LETV-M3U8-VER:ver_00_22

#EXT-LETV-PROGRAM-DESCIPTION

#EXT-LETV-PROGRAM-ID:60506e98dba03609f162c0a1319f8365000

#EXT-LETV-VIDEO:CODEC=H264

#EXT-LETV-PIC-WIDTH:1905

#EXT-LETV-PIC-HEIGHT:1072

#EXT-LETV-TOTAL-TS-LENGTH:94752

#EXT-LETV-TOTAL-ES-LENGTH:1137421244

#EXT-LETV-TOTAL-SEGMENT:168

#EXT-LETV-TOTAL-P2P-PIECE:6134

#EXT-LETV-TOTAL-DURATION:2820.878

#EXT-LETV-START-TIME:0.000

#EXT-LETV-SEGMENT-ID:0

#EXT-LETV-P2P-PIECE-NUMBER:3

#EXT-LETV-CKS:TN=0&KEY=0&SZ=564&CKS=1901

#EXT-LETV-CKS:PN=0&SZ=192512&CKS=28015&DURA=2.000

#EXT-LETV-CKS:PN=1&SZ=192512&CKS=55591

#EXT-LETV-CKS:PN=2&SZ=132728&CKS=581

#EXTINF:2.000,

http://39.130.134.23:80/199/2/78/letv-uts/14/ver_00_22-1053883476-avc-2999799-aac-128000-2820200-1106779568-60506e98dba03609f162c0a1319f8365-1467722446828_mp4/ver_00_22_0_0_1_518316_0_0.ts?mltag=0&platid=1&splatid=101&playid=0&geo=CN-25-353-4&tag=le&ch=&p1=&p2=&p3=&tss=ios&b=3139&bf=49&nlh=4096&path=&sign=le&proxy=3719678013,1880988461,3719677991&uuid=&ntm=1489597800&keyitem=GOw_33YJAAbXYE-cnQwpfLlv_b2zAkYctFVqe5bsXQpaGNn3T1-vhw..&its=0&nkey2=7f9f830a5d1b7eb9f9247a5bc302a746&uid=1971868787.rp&qos=3&enckit=&m3v=1&token=&vid=&liveid=&station=&app_name=&app_ver=&fcheck=0&pantm=&panuid=&pantoken=&cips=117.136.84.115&vod_live_path=&ledituid=&leditcid=&leditcip=&leditfl=&leditafl=&ajax=&lsbv=
jindaxia commented 7 years ago

这就一段啊。

redstoneleo commented 7 years ago

其实内容就在最高清晰度的这个m3u8里

C:\Users\i>python3 C:\Users\i\AppData\Local\Programs\Python\Python35-32\Scripts\
ykdl.py -i http://www.le.com/ptv/vplay/1847799.html
site:                乐视 (Letv)
title:               大宅门01
artist:              None
streams:
    - format:        BD
      container:     m3u8
      video-profile: 1080p
    # download-with: ykdl --format=BD [URL]
Real urls:
C:\Users\i\AppData\Local\Temp\tmpir1mxyco.m3u8
redstoneleo commented 7 years ago

之前是我的代码有问题

>>> l=['大宅门06_01.ts', '大宅门06_02.ts', '大宅门06_03.ts', '大宅门06_04.ts', '大宅门06_05.ts', '大宅门06_06.ts', '大宅门06_07.ts', '大宅门06_08.ts', '大宅门06_09.ts', '大宅门06_10.ts', '大宅门06_100.ts', '大宅门06_101.ts', '大宅门06_102.ts', '大宅门06_103.ts', '大宅门06_104.ts', '大宅门06_105.ts', '大宅门06_106.ts', '大宅门06_107.ts', '大宅门06_108.ts', '大宅门06_109.ts', '大宅门06_11.ts', '大宅门06_110.ts', '大宅门06_111.ts', '大宅门06_112.ts', '大宅门06_113.ts', '大宅门06_114.ts', '大宅门06_115.ts', '大宅门06_116.ts', '大宅门06_117.ts', '大宅门06_118.ts', '大宅门06_119.ts', '大宅门06_12.ts', '大宅门06_120.ts', '大宅门06_121.ts', '大宅门06_122.ts', '大宅门06_123.ts', '大宅门06_124.ts', '大宅门06_125.ts', '大宅门06_126.ts', '大宅门06_127.ts', '大宅门06_128.ts', '大宅门06_129.ts', '大宅门06_13.ts', '大宅门06_130.ts', '大宅门06_131.ts', '大宅门06_132.ts', '大宅门06_133.ts', '大宅门06_134.ts', '大宅门06_135.ts', '大宅门06_136.ts', '大宅门06_137.ts', '大宅门06_138.ts', '大宅门06_139.ts', '大宅门06_14.ts', '大宅门06_140.ts', '大宅门06_141.ts', '大宅门06_142.ts', '大宅门06_143.ts', '大宅门06_144.ts', '大宅门06_145.ts', '大宅门06_146.ts', '大宅门06_147.ts', '大宅门06_148.ts', '大宅门06_149.ts', '大宅门06_15.ts', '大宅门06_150.ts', '大宅门06_151.ts', '大宅门06_152.ts', '大宅门06_153.ts', '大宅门06_154.ts', '大宅门06_155.ts', '大宅门06_156.ts', '大宅门06_157.ts', '大宅门06_158.ts', '大宅门06_159.ts', '大宅门06_16.ts', '大宅门06_160.ts', '大宅门06_161.ts', '大宅门06_162.ts', '大宅门06_163.ts', '大宅门06_164.ts', '大宅门06_165.ts', '大宅门06_166.ts', '大宅门06_167.ts', '大宅门06_168.ts', '大宅门06_169.ts', '大宅门06_17.ts', '大宅门06_18.ts', '大宅门06_19.ts', '大宅门06_20.ts', '大宅门06_21.ts', '大宅门06_22.ts', '大宅门06_23.ts', '大宅门06_24.ts', '大宅门06_25.ts', '大宅门06_26.ts', '大宅门06_27.ts', '大宅门06_28.ts', '大宅门06_29.ts', '大宅门06_30.ts', '大宅门06_31.ts', '大宅门06_32.ts', '大宅门06_33.ts', '大宅门06_34.ts', '大宅门06_35.ts', '大宅门06_36.ts', '大宅门06_37.ts', '大宅门06_38.ts', '大宅门06_39.ts', '大宅门06_40.ts', '大宅门06_41.ts', '大宅门06_42.ts', '大宅门06_43.ts', '大宅门06_44.ts', '大宅门06_45.ts', '大宅门06_46.ts', '大宅门06_47.ts', '大宅门06_48.ts', '大宅门06_49.ts', '大宅门06_50.ts', '大宅门06_51.ts', '大宅门06_52.ts', '大宅门06_53.ts', '大宅门06_54.ts', '大宅门06_55.ts', '大宅门06_56.ts', '大宅门06_57.ts', '大宅门06_58.ts', '大宅门06_59.ts', '大宅门06_60.ts', '大宅门06_61.ts', '大宅门06_62.ts', '大宅门06_63.ts', '大宅门06_64.ts', '大宅门06_65.ts', '大宅门06_66.ts', '大宅门06_67.ts', '大宅门06_68.ts', '大宅门06_69.ts', '大宅门06_70.ts', '大宅门06_71.ts', '大宅门06_72.ts', '大宅门06_73.ts', '大宅门06_74.ts', '大宅门06_75.ts', '大宅门06_76.ts', '大宅门06_77.ts', '大宅门06_78.ts', '大宅门06_79.ts', '大宅门06_80.ts', '大宅门06_81.ts', '大宅门06_82.ts', '大宅门06_83.ts', '大宅门06_84.ts', '大宅门06_85.ts', '大宅门06_86.ts', '大宅门06_87.ts', '大宅门06_88.ts', '大宅门06_89.ts', '大宅门06_90.ts', '大宅门06_91.ts', '大宅门06_92.ts', '大宅门06_93.ts', '大宅门06_94.ts', '大宅门06_95.ts', '大宅门06_96.ts', '大宅门06_97.ts', '大宅门06_98.ts', '大宅门06_99.ts']

>>>
>>> sorted(l)
['大宅门06_01.ts', '大宅门06_02.ts', '大宅门06_03.ts', '大宅门06_04.ts', '大宅门06_05.ts', '大宅门06_06.ts', '大宅门06_07.ts', '大宅门06_08.ts', '大宅门06_09.ts', '大宅门06_10.ts', '大宅门06_100.ts', '大宅门06_101.ts', '大宅门06_102.ts', '大宅门06_103.ts', '大宅门06_104.ts', '大宅门06_105.ts', '大宅门06_106.ts', '大宅门06_107.ts', '大宅门06_108.ts', '大宅门06_109.ts', '大宅门06_11.ts', '大宅门06_110.ts', '大宅门06_111.ts', '大宅门06_112.ts', '大宅门06_113.ts', '大宅门06_114.ts', '大宅门06_115.ts', '大宅门06_116.ts', '大宅门06_117.ts', '大宅门06_118.ts', '大宅门06_119.ts', '大宅门06_12.ts', '大宅门06_120.ts', '大宅门06_121.ts', '大宅门06_122.ts', '大宅门06_123.ts', '大宅门06_124.ts', '大宅门06_125.ts', '大宅门06_126.ts', '大宅门06_127.ts', '大宅门06_128.ts', '大宅门06_129.ts', '大宅门06_13.ts', '大宅门06_130.ts', '大宅门06_131.ts', '大宅门06_132.ts', '大宅门06_133.ts', '大宅门06_134.ts', '大宅门06_135.ts', '大宅门06_136.ts', '大宅门06_137.ts', '大宅门06_138.ts', '大宅门06_139.ts', '大宅门06_14.ts', '大宅门06_140.ts', '大宅门06_141.ts', '大宅门06_142.ts', '大宅门06_143.ts', '大宅门06_144.ts', '大宅门06_145.ts', '大宅门06_146.ts', '大宅门06_147.ts', '大宅门06_148.ts', '大宅门06_149.ts', '大宅门06_15.ts', '大宅门06_150.ts', '大宅门06_151.ts', '大宅门06_152.ts', '大宅门06_153.ts', '大宅门06_154.ts', '大宅门06_155.ts', '大宅门06_156.ts', '大宅门06_157.ts', '大宅门06_158.ts', '大宅门06_159.ts', '大宅门06_16.ts', '大宅门06_160.ts', '大宅门06_161.ts', '大宅门06_162.ts', '大宅门06_163.ts', '大宅门06_164.ts', '大宅门06_165.ts', '大宅门06_166.ts', '大宅门06_167.ts', '大宅门06_168.ts', '大宅门06_169.ts', '大宅门06_17.ts', '大宅门06_18.ts', '大宅门06_19.ts', '大宅门06_20.ts', '大宅门06_21.ts', '大宅门06_22.ts', '大宅门06_23.ts', '大宅门06_24.ts', '大宅门06_25.ts', '大宅门06_26.ts', '大宅门06_27.ts', '大宅门06_28.ts', '大宅门06_29.ts', '大宅门06_30.ts', '大宅门06_31.ts', '大宅门06_32.ts', '大宅门06_33.ts', '大宅门06_34.ts', '大宅门06_35.ts', '大宅门06_36.ts', '大宅门06_37.ts', '大宅门06_38.ts', '大宅门06_39.ts', '大宅门06_40.ts', '大宅门06_41.ts', '大宅门06_42.ts', '大宅门06_43.ts', '大宅门06_44.ts', '大宅门06_45.ts', '大宅门06_46.ts', '大宅门06_47.ts', '大宅门06_48.ts', '大宅门06_49.ts', '大宅门06_50.ts', '大宅门06_51.ts', '大宅门06_52.ts', '大宅门06_53.ts', '大宅门06_54.ts', '大宅门06_55.ts', '大宅门06_56.ts', '大宅门06_57.ts', '大宅门06_58.ts', '大宅门06_59.ts', '大宅门06_60.ts', '大宅门06_61.ts', '大宅门06_62.ts', '大宅门06_63.ts', '大宅门06_64.ts', '大宅门06_65.ts', '大宅门06_66.ts', '大宅门06_67.ts', '大宅门06_68.ts', '大宅门06_69.ts', '大宅门06_70.ts', '大宅门06_71.ts', '大宅门06_72.ts', '大宅门06_73.ts', '大宅门06_74.ts', '大宅门06_75.ts', '大宅门06_76.ts', '大宅门06_77.ts', '大宅门06_78.ts', '大宅门06_79.ts', '大宅门06_80.ts', '大宅门06_81.ts', '大宅门06_82.ts', '大宅门06_83.ts', '大宅门06_84.ts', '大宅门06_85.ts', '大宅门06_86.ts', '大宅门06_87.ts', '大宅门06_88.ts', '大宅门06_89.ts', '大宅门06_90.ts', '大宅门06_91.ts', '大宅门06_92.ts', '大宅门06_93.ts', '大宅门06_94.ts', '大宅门06_95.ts', '大宅门06_96.ts', '大宅门06_97.ts', '大宅门06_98.ts', '大宅门06_99.ts']
>>> 

很显然是无法把分块排序

我看ykdl.py里似乎没有下完所有视频片段的时候再排序合并视频,不知道老大是怎么处理的?@zhangn1985

        save_urls(urls, name, ext, jobs=args.jobs)
        lenth = len(urls)
        if lenth > 1 and not args.no_merge:
            ret = launch_ffmpeg(name, ext, lenth)
            if not ret:
                clean_slices(name, ext, lenth)
zhangn1985 commented 7 years ago

save_urls保存的文件就是排好序的。

redstoneleo commented 7 years ago

其实未必要排序,我通过下面的代码得到了启示--用for-loop搞定,O(∩_∩)O哈哈哈~

def launch_ffmpeg(basename, ext, lenth):
    #build input
    inputfile = compact_tempfile(mode='w+t', suffix='.txt', dir='.', encoding='utf-8')
    for i in range(lenth):
        inputfile.write('file \'%s_%d_.%s\'\n' % (basename, i, ext))
    inputfile.flush()