精华内容
下载资源
问答
  • M3U8文件是一个索引文件,里面包好N个TS的分片文件,组成一个视频文件。目前在直播和点播中应用非常广泛。我们下载一个M3U8视频文件,就是下载了N个TS分片文件,导致我们手机相册中多了很多碎片的小视频文件。如果是...

    M3U8文件是一个索引文件,里面包好N个TS的分片文件,组成一个视频文件。目前在直播和点播中应用非常广泛。我们下载一个M3U8视频文件,就是下载了N个TS分片文件,导致我们手机相册中多了很多碎片的小视频文件。如果是羞羞的视频,更加不好意思了。删除都要删除半天,更不用说想把M3U8文件拷贝出来,放到电脑上观看欣赏。

    例如给一个M3U8例子:https://tv2.youkutv.cc/2020/04/14/MbqulRmS8sjQGJG9/playlist.m3u8,解析出来的索引文件如下:

    #EXTM3U

    #EXT-X-VERSION:3

    #EXT-X-MEDIA-SEQUENCE:0

    #EXT-X-ALLOW-CACHE:YES

    #EXT-X-TARGETDURATION:19

    #EXTINF:13.960000,

    out000.ts

    #EXTINF:6.320000,

    out001.ts

    #EXTINF:10.280000,

    out002.ts

    #EXTINF:10.320000,

    out003.ts

    #EXTINF:9.960000,

    out004.ts

    #EXTINF:12.240000,

    out005.ts

    #EXTINF:8.680000,

    out006.ts

    #EXTINF:8.280000,

    out007.ts

    #EXTINF:10.240000,

    out008.ts

    #EXTINF:15.000000,

    out009.ts

    #EXTINF:5.000000,

    out010.ts

    #EXTINF:14.200000,

    out011.ts

    #EXTINF:7.920000,

    out012.ts

    #EXTINF:8.920000,

    out013.ts

    #EXTINF:10.960000,

    out014.ts

    #EXTINF:7.920000,

    out015.ts

    #EXTINF:10.000000,

    out016.ts

    #EXTINF:12.040000,

    out017.ts

    #EXTINF:9.280000,

    out018.ts

    #EXTINF:17.160000,

    out019.ts

    #EXTINF:8.080000,

    out020.ts

    #EXTINF:6.840000,

    out021.ts

    #EXTINF:8.040000,

    out022.ts

    #EXTINF:11.640000,

    out023.ts

    #EXTINF:10.000000,

    out024.ts

    #EXTINF:7.760000,

    out025.ts

    #EXTINF:9.040000,

    out026.ts

    #EXTINF:13.760000,

    out027.ts

    #EXTINF:7.120000,

    out028.ts

    #EXTINF:10.560000,

    out029.ts

    #EXTINF:11.640000,

    out030.ts

    #EXTINF:7.880000,

    out031.ts

    #EXTINF:11.880000,

    out032.ts

    #EXTINF:12.640000,

    out033.ts

    #EXTINF:6.920000,

    out034.ts

    #EXTINF:8.320000,

    out035.ts

    #EXTINF:10.720000,

    out036.ts

    #EXTINF:8.840000,

    out037.ts

    #EXTINF:10.320000,

    out038.ts

    #EXTINF:9.760000,

    out039.ts

    #EXTINF:10.320000,

    out040.ts

    #EXTINF:10.800000,

    out041.ts

    #EXTINF:13.200000,

    out042.ts

    #EXTINF:7.480000,

    out043.ts

    #EXTINF:8.560000,

    out044.ts

    #EXTINF:10.160000,

    out045.ts

    #EXTINF:10.160000,

    out046.ts

    #EXTINF:9.360000,

    out047.ts

    #EXTINF:11.960000,

    out048.ts

    #EXTINF:10.640000,

    out049.ts

    #EXTINF:11.360000,

    out050.ts

    #EXTINF:8.040000,

    out051.ts

    #EXTINF:7.640000,

    out052.ts

    #EXTINF:10.480000,

    out053.ts

    #EXTINF:10.400000,

    out054.ts

    #EXTINF:9.360000,

    out055.ts

    #EXTINF:15.720000,

    out056.ts

    #EXTINF:4.600000,

    out057.ts

    #EXTINF:9.640000,

    out058.ts

    #EXTINF:17.800000,

    out059.ts

    #EXTINF:6.040000,

    out060.ts

    #EXTINF:9.400000,

    out061.ts

    #EXTINF:10.000000,

    out062.ts

    #EXTINF:10.000000,

    out063.ts

    #EXTINF:10.000000,

    out064.ts

    #EXTINF:10.000000,

    out065.ts

    #EXTINF:9.000000,

    out066.ts

    #EXTINF:10.000000,

    out067.ts

    #EXTINF:10.000000,

    out068.ts

    #EXTINF:8.920000,

    out069.ts

    #EXTINF:15.920000,

    out070.ts

    #EXTINF:5.200000,

    out071.ts

    #EXTINF:8.240000,

    out072.ts

    #EXTINF:13.200000,

    out073.ts

    #EXTINF:14.400000,

    out074.ts

    #EXTINF:8.960000,

    out075.ts

    #EXTINF:5.880000,

    out076.ts

    #EXTINF:10.000000,

    out077.ts

    #EXTINF:10.000000,

    out078.ts

    #EXTINF:6.720000,

    out079.ts

    #EXTINF:16.720000,

    out080.ts

    #EXTINF:10.000000,

    out081.ts

    #EXTINF:10.000000,

    out082.ts

    #EXTINF:10.000000,

    out083.ts

    #EXTINF:9.640000,

    out084.ts

    #EXTINF:9.080000,

    out085.ts

    #EXTINF:7.000000,

    out086.ts

    #EXTINF:10.000000,

    out087.ts

    #EXTINF:17.320000,

    out088.ts

    #EXTINF:9.920000,

    out089.ts

    #EXTINF:8.000000,

    out090.ts

    #EXTINF:6.040000,

    out091.ts

    #EXTINF:7.560000,

    out092.ts

    #EXTINF:10.000000,

    out093.ts

    #EXTINF:8.800000,

    out094.ts

    #EXTINF:10.000000,

    out095.ts

    #EXTINF:10.000000,

    out096.ts

    #EXTINF:12.200000,

    out097.ts

    #EXTINF:10.000000,

    out098.ts

    #EXTINF:17.240000,

    out099.ts

    #EXTINF:10.000000,

    out100.ts

    #EXTINF:9.680000,

    out101.ts

    #EXTINF:10.000000,

    out102.ts

    #EXTINF:10.000000,

    out103.ts

    #EXTINF:10.000000,

    out104.ts

    #EXTINF:10.000000,

    out105.ts

    #EXTINF:10.000000,

    out106.ts

    #EXTINF:10.000000,

    out107.ts

    #EXTINF:10.000000,

    out108.ts

    #EXTINF:9.080000,

    out109.ts

    #EXTINF:10.000000,

    out110.ts

    #EXTINF:10.000000,

    out111.ts

    #EXTINF:10.000000,

    out112.ts

    #EXTINF:10.000000,

    out113.ts

    #EXTINF:10.000000,

    out114.ts

    #EXTINF:10.000000,

    out115.ts

    #EXTINF:10.000000,

    out116.ts

    #EXTINF:6.040000,

    out117.ts

    #EXTINF:9.000000,

    out118.ts

    #EXTINF:10.000000,

    out119.ts

    #EXTINF:10.000000,

    out120.ts

    #EXTINF:10.000000,

    out121.ts

    #EXTINF:10.000000,

    out122.ts

    #EXTINF:10.000000,

    out123.ts

    #EXTINF:10.000000,

    out124.ts

    #EXTINF:10.000000,

    out125.ts

    #EXTINF:10.000000,

    out126.ts

    #EXTINF:10.000000,

    out127.ts

    #EXTINF:10.000000,

    out128.ts

    #EXTINF:10.000000,

    out129.ts

    #EXTINF:10.000000,

    out130.ts

    #EXTINF:10.000000,

    out131.ts

    #EXTINF:9.760000,

    out132.ts

    #EXTINF:10.000000,

    out133.ts

    #EXTINF:10.000000,

    out134.ts

    #EXTINF:10.000000,

    out135.ts

    #EXTINF:10.000000,

    out136.ts

    #EXTINF:10.000000,

    out137.ts

    #EXTINF:8.880000,

    out138.ts

    #EXTINF:9.240000,

    out139.ts

    #EXTINF:11.840000,

    out140.ts

    #EXTINF:10.000000,

    out141.ts

    #EXTINF:10.000000,

    out142.ts

    #EXTINF:8.280000,

    out143.ts

    #EXTINF:10.000000,

    out144.ts

    #EXTINF:16.400000,

    out145.ts

    #EXTINF:3.960000,

    out146.ts

    #EXTINF:10.160000,

    out147.ts

    #EXTINF:8.360000,

    out148.ts

    #EXTINF:11.160000,

    out149.ts

    #EXTINF:12.440000,

    out150.ts

    #EXTINF:7.520000,

    out151.ts

    #EXTINF:12.600000,

    out152.ts

    #EXTINF:14.400000,

    out153.ts

    #EXTINF:4.800000,

    out154.ts

    #EXTINF:13.280000,

    out155.ts

    #EXTINF:10.000000,

    out156.ts

    #EXTINF:6.520000,

    out157.ts

    #EXTINF:9.160000,

    out158.ts

    #EXTINF:10.000000,

    out159.ts

    #EXTINF:7.920000,

    out160.ts

    #EXTINF:17.960000,

    out161.ts

    #EXTINF:8.000000,

    out162.ts

    #EXTINF:10.000000,

    out163.ts

    #EXTINF:10.000000,

    out164.ts

    #EXTINF:8.680000,

    out165.ts

    #EXTINF:8.920000,

    out166.ts

    #EXTINF:15.880000,

    out167.ts

    #EXTINF:3.360000,

    out168.ts

    #EXTINF:11.200000,

    out169.ts

    #EXTINF:8.160000,

    out170.ts

    #EXTINF:10.920000,

    out171.ts

    #EXTINF:8.280000,

    out172.ts

    #EXTINF:8.640000,

    out173.ts

    #EXTINF:14.400000,

    out174.ts

    #EXTINF:10.000000,

    out175.ts

    #EXTINF:8.960000,

    out176.ts

    #EXTINF:10.000000,

    out177.ts

    #EXTINF:13.560000,

    out178.ts

    #EXTINF:10.000000,

    out179.ts

    #EXTINF:10.000000,

    out180.ts

    #EXTINF:10.000000,

    out181.ts

    #EXTINF:10.000000,

    out182.ts

    #EXTINF:10.000000,

    out183.ts

    #EXTINF:10.000000,

    out184.ts

    #EXTINF:10.000000,

    out185.ts

    #EXTINF:10.000000,

    out186.ts

    #EXTINF:10.000000,

    out187.ts

    #EXTINF:10.000000,

    out188.ts

    #EXTINF:10.000000,

    out189.ts

    #EXTINF:10.000000,

    out190.ts

    #EXTINF:10.000000,

    out191.ts

    #EXTINF:10.000000,

    out192.ts

    #EXTINF:10.000000,

    out193.ts

    #EXTINF:10.000000,

    out194.ts

    #EXTINF:9.200000,

    out195.ts

    #EXTINF:10.000000,

    out196.ts

    #EXTINF:10.000000,

    out197.ts

    #EXTINF:10.000000,

    out198.ts

    #EXTINF:8.720000,

    out199.ts

    #EXTINF:10.000000,

    out200.ts

    #EXTINF:13.040000,

    out201.ts

    #EXTINF:6.360000,

    out202.ts

    #EXTINF:10.000000,

    out203.ts

    #EXTINF:15.200000,

    out204.ts

    #EXTINF:7.960000,

    out205.ts

    #EXTINF:8.120000,

    out206.ts

    #EXTINF:10.000000,

    out207.ts

    #EXTINF:9.600000,

    out208.ts

    #EXTINF:9.720000,

    out209.ts

    #EXTINF:10.000000,

    out210.ts

    #EXTINF:10.000000,

    out211.ts

    #EXTINF:10.000000,

    out212.ts

    #EXTINF:9.160000,

    out213.ts

    #EXTINF:10.000000,

    out214.ts

    #EXTINF:10.000000,

    out215.ts

    #EXTINF:8.040000,

    out216.ts

    #EXTINF:10.000000,

    out217.ts

    #EXTINF:10.000000,

    out218.ts

    #EXTINF:10.000000,

    out219.ts

    #EXTINF:10.000000,

    out220.ts

    #EXTINF:10.000000,

    out221.ts

    #EXTINF:10.000000,

    out222.ts

    #EXTINF:10.000000,

    out223.ts

    #EXTINF:10.000000,

    out224.ts

    #EXTINF:8.240000,

    out225.ts

    #EXTINF:15.200000,

    out226.ts

    #EXTINF:6.200000,

    out227.ts

    #EXTINF:9.560000,

    out228.ts

    #EXTINF:10.000000,

    out229.ts

    #EXTINF:10.000000,

    out230.ts

    #EXTINF:10.000000,

    out231.ts

    #EXTINF:9.560000,

    out232.ts

    #EXTINF:9.640000,

    out233.ts

    #EXTINF:17.880000,

    out234.ts

    #EXTINF:8.600000,

    out235.ts

    #EXTINF:9.560000,

    out236.ts

    #EXTINF:10.000000,

    out237.ts

    #EXTINF:10.000000,

    out238.ts

    #EXTINF:8.000000,

    out239.ts

    #EXTINF:10.000000,

    out240.ts

    #EXTINF:10.000000,

    out241.ts

    #EXTINF:10.000000,

    out242.ts

    #EXTINF:10.000000,

    out243.ts

    #EXTINF:10.000000,

    out244.ts

    #EXTINF:10.000000,

    out245.ts

    #EXTINF:9.440000,

    out246.ts

    #EXTINF:14.240000,

    out247.ts

    #EXTINF:5.840000,

    out248.ts

    #EXTINF:6.600000,

    out249.ts

    #EXTINF:9.920000,

    out250.ts

    #EXTINF:11.080000,

    out251.ts

    #EXTINF:14.600000,

    out252.ts

    #EXTINF:7.160000,

    out253.ts

    #EXTINF:8.840000,

    out254.ts

    #EXTINF:11.320000,

    out255.ts

    #EXTINF:8.720000,

    out256.ts

    #EXTINF:8.240000,

    out257.ts

    #EXTINF:9.880000,

    out258.ts

    #EXTINF:18.480000,

    out259.ts

    #EXTINF:10.000000,

    out260.ts

    #EXTINF:8.760000,

    out261.ts

    #EXTINF:9.240000,

    out262.ts

    #EXTINF:6.120000,

    out263.ts

    #EXTINF:13.480000,

    out264.ts

    #EXTINF:10.000000,

    out265.ts

    #EXTINF:8.360000,

    out266.ts

    #EXTINF:6.080000,

    out267.ts

    #EXTINF:14.080000,

    out268.ts

    #EXTINF:7.520000,

    out269.ts

    #EXTINF:9.240000,

    out270.ts

    #EXTINF:10.000000,

    out271.ts

    #EXTINF:6.960000,

    out272.ts

    #EXT-X-ENDLIST

    PD1824:/sdcard/Android/data/com.jeffmony.videodemo/files/Video/Download/a03663b3bd0a2fe6fcb8bb36b657cf80 $ ls

    local.m3u8 video_124.ts video_152.ts video_180.ts video_208.ts video_236.ts video_264.ts video_47.ts video_75.ts

    remote.m3u8 video_125.ts video_153.ts video_181.ts video_209.ts video_237.ts video_265.ts video_48.ts video_76.ts

    video_0.ts video_126.ts video_154.ts video_182.ts video_21.ts video_238.ts video_266.ts video_49.ts video_77.ts

    video_1.ts video_127.ts video_155.ts video_183.ts video_210.ts video_239.ts video_267.ts video_5.ts video_78.ts

    video_10.ts video_128.ts video_156.ts video_184.ts video_211.ts video_24.ts video_268.ts video_50.ts video_79.ts

    video_100.ts video_129.ts video_157.ts video_185.ts video_212.ts video_240.ts video_269.ts video_51.ts video_8.ts

    video_101.ts video_13.ts video_158.ts video_186.ts video_213.ts video_241.ts video_27.ts video_52.ts video_80.ts

    video_102.ts video_130.ts video_159.ts video_187.ts video_214.ts video_242.ts video_270.ts video_53.ts video_81.ts

    video_103.ts video_131.ts video_16.ts video_188.ts video_215.ts video_243.ts video_271.ts video_54.ts video_82.ts

    video_104.ts video_132.ts video_160.ts video_189.ts video_216.ts video_244.ts video_272.ts video_55.ts video_83.ts

    video_105.ts video_133.ts video_161.ts video_19.ts video_217.ts video_245.ts video_28.ts video_56.ts video_84.ts

    video_106.ts video_134.ts video_162.ts video_190.ts video_218.ts video_246.ts video_29.ts video_57.ts video_85.ts

    video_107.ts video_135.ts video_163.ts video_191.ts video_219.ts video_247.ts video_3.ts video_58.ts video_86.ts

    video_108.ts video_136.ts video_164.ts video_192.ts video_22.ts video_248.ts video_30.ts video_59.ts video_87.ts

    video_109.ts video_137.ts video_165.ts video_193.ts video_220.ts video_249.ts video_31.ts video_6.ts video_88.ts

    video_11.ts video_138.ts video_166.ts video_194.ts video_221.ts video_25.ts video_32.ts video_60.ts video_89.ts

    video_110.ts video_139.ts video_167.ts video_195.ts video_222.ts video_250.ts video_33.ts video_61.ts video_9.ts

    video_111.ts video_14.ts video_168.ts video_196.ts video_223.ts video_251.ts video_34.ts video_62.ts video_90.ts

    video_112.ts video_140.ts video_169.ts video_197.ts video_224.ts video_252.ts video_35.ts video_63.ts video_91.ts

    video_113.ts video_141.ts video_17.ts video_198.ts video_225.ts video_253.ts video_36.ts video_64.ts video_92.ts

    video_114.ts video_142.ts video_170.ts video_199.ts video_226.ts video_254.ts video_37.ts video_65.ts video_93.ts

    video_115.ts video_143.ts video_171.ts video_2.ts video_227.ts video_255.ts video_38.ts video_66.ts video_94.ts

    video_116.ts video_144.ts video_172.ts video_20.ts video_228.ts video_256.ts video_39.ts video_67.ts video_95.ts

    video_117.ts video_145.ts video_173.ts video_200.ts video_229.ts video_257.ts video_4.ts video_68.ts video_96.ts

    video_118.ts video_146.ts video_174.ts video_201.ts video_23.ts video_258.ts video_40.ts video_69.ts video_97.ts

    video_119.ts video_147.ts video_175.ts video_202.ts video_230.ts video_259.ts video_41.ts video_7.ts video_98.ts

    video_12.ts video_148.ts video_176.ts video_203.ts video_231.ts video_26.ts video_42.ts video_70.ts video_99.ts

    video_120.ts video_149.ts video_177.ts video_204.ts video_232.ts video_260.ts video_43.ts video_71.ts

    video_121.ts video_15.ts video_178.ts video_205.ts video_233.ts video_261.ts video_44.ts video_72.ts

    video_122.ts video_150.ts video_179.ts video_206.ts video_234.ts video_262.ts video_45.ts video_73.ts

    video_123.ts video_151.ts video_18.ts video_207.ts video_235.ts video_263.ts video_46.ts video_74.ts

    如果能将这些TS文件合成一个视频文件就好了。

    TS文件合成一个MP4视频,需要的注意点有:

    有些M3U8视频是加密的,TS源文件需要解密才能播放

    TS文件一个个拼接的方式最后得到的还是一个TS视频,只不过比较大一点,并不是后缀名改成.mp4就是MP4视频了。

    加密的视频

    M3U8中的EXT-X-KEY中就包含M3U8的加密方式以及密钥。

    例如http://video.yjf138.com:8091/20180812/6yl0Q2YZ/index.m3u8中就有

    #EXT-X-KEY:METHOD=AES-128,URI="key.key"

    可以看出加密方式是AES-128对称加密,密钥是key.key

    转化为链接就是:https://video.yjf138.com:8091/20180812/6yl0Q2YZ/1500kb/hls/key.key

    那我们就可以使用AES-128解密了,通常的做法是:

    /**

    * 解密ts

    *

    * @param sSrc ts文件字节数组

    * @param sKey 密钥

    * @return 解密后的字节数组

    */

    private static byte[] decrypt(byte[] sSrc, String sKey, String method) {

    try {

    if (StringUtils.isNotEmpty(method) && !method.contains("AES")) {

    throw new M3u8Exception("未知的算法!");

    }

    // 判断Key是否正确

    if (StringUtils.isEmpty(sKey)) {

    return sSrc;

    }

    // 判断Key是否为16位

    if (sKey.length() != 16) {

    System.out.print("Key长度不是16位");

    return null;

    }

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

    SecretKeySpec keySpec = new SecretKeySpec(sKey.getBytes("utf-8"), "AES");

    // 如果m3u8有IV标签,那么IvParameterSpec构造函数就把IV标签后的内容转成字节数组传进去

    AlgorithmParameterSpec paramSpec = new IvParameterSpec(new byte[16]);

    cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec);

    return cipher.doFinal(sSrc);

    } catch (Exception ex) {

    ex.printStackTrace();

    return null;

    }

    }

    但是在Android平台上,这样的写法并不能兼容所有的场景,因为不同Android level上面的crypto写法不同,调用系统的api得到的结果也会不一样,所以最好将解密场景放在native层,使用openssl库来帮我们实现解密。

    TS转化为MP4

    之前说过,TS合并通常的做法使用InputStream读取一个一个的TS分片,然后利用OutputStream写入本地的MP4文件中,这样看上去好像是生成了一个新的MP4文件,但是实际上这个新的视频是真正的MP4格式吗?

    显然不是,因为MP4的封装格式和TS是完全不一样的。

    最好的做法就是将最终生成的文件按照MP4的封装规则重写一遍,这样最终生成的文件肯定是MP4的文件。

    我们不用对照MP4的位flag来一个个生成,只要借助ffmpeg来帮我们实现这个转化就可以了。

    对源文件进行解封装处理,取出源文件的音频流和视频流

    创建目标文件的封装格式头信息。

    读取源文件音频流和视频流中的包数据、帧数据,然后按照规则封装到目标文件格式中。

    842689a1fc84

    展开全文
  • 经常在微信里看到一些人分享的小视频,都是在线网址的形式,不使用手机...TS助手可以在线分析m3u8文件,并下载所有的视频文件,还可以把下载的文件合成为mp4。 ###########输入任意注册码即可跳出真码,重启注册成功
  • 此软件可以实现TS下载,TS解密合并,TS转MP4,TS视频播放,功能强大,分享给有需要的朋友。文档中有下载地址
  • 浏览器javascript 下载m3u8视频合成mp4

    千次阅读 2020-04-26 13:34:44
    download m3u8 URL to mp4 下载m3u8视频合成一个完整的mp4 源码:https://github.com/ccjy88/m3u8download.js 功能 m3u8downloader是在chrome浏览器中运行的html和js,用于下载m3u8视频。 当视频链接比如是...

    m3u8download.js

    download m3u8 URL to mp4 下载m3u8视频合成一个完整的mp4
    源码:https://github.com/ccjy88/m3u8download.js

    功能

    m3u8downloader是在chrome浏览器中运行的html和js,用于下载m3u8视频。
    当视频链接比如是https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8
    m3u8download可以自动分析m3u8文件,下载多个ts文件,视频是AES-128加密的,
    m3u8downloader进行解密后存为ts文件。并生成ffmepg用于concat的文件,可以
    用ffmpeg命令合成一个完整的mp4文件。

    特征

    • 输入m3u8 URL,下载分析m3u8。
    • 下载m3u8中的嵌套的playlist,下载相关的m3u8 URL.
    • 下载m3u8中的ts视频文件。
    • 支持ts视频AES-128解密
    • 生成ffmpeg命令需要的f.txt文件清单文件。
    • 方便用ffmpeg命令将所有ts文件按f.txt的次序合成一个mp4文件。
    • 提供python文件检查下载失败的ts,可在文件名callback中定义,只下载指定的缺失文件。

    使用方法

    将m3u8index.html和dist目录copy到nginx的html目录。
    比如nginx安装在本地d:\nginx-1.80.0
    运行deploy.cmd
    copy m3u8*.html D:\nginx-1.18.0\html
    xcopy /E /Y dist D:\nginx-1.18.0\html\dist

    启动nginx,用chrome访问http://127.0.0.1/m3u8index.html, 在URL地址输入相关的m3u8地址。
    比如搜到电影《极限逃生》,在Chrome浏览器中按F12,看Network中m3u8URL是
    https://dbx5.tyswmp.com/20190910/oKHsD3EG/900kb/hls/index.m3u8,
    把这个地址复制到m3u8index.html页面中,点击"下载"钮就可以。

    chrome浏览器配置

    下载目录设置:chrome://settings/downloads 比如为d:\downloads
    自动下载设置: chrome://settings/content/automaticDownloads 必须允许http://127.0.0.1自动下载。

    合成mp4的方法:

    安装ffmepeg for windows
    运行cmd。
    cd d:\downloads
    ffmpeg -f concat -i f.txt -c copy -y full.mp4
    这样就把所有的ts文件生成一个完整的full.mp4。

    错误处理

    如果下载过程中f.txt文件中有而实际下载失败,可以运行python checktsfile.py
    将缺失文件定义到m3u8index.html中的 check_list_cb函数中filelist,再下载一次缺失文件就可以。

    编译方法:

    cnpm install
    cnpm run build

    参数调整

    m3u8index.html中options.maxthreadcount并行几个xhr同时下载ts文件。默认为5。
    writetimeout为写入文件的定时器间隔,默认200毫秒。如果机器慢文件大这个值调大。

    展开全文
  • m3u8文件批量下载,支持m3u8 url和下载到本地的m3u8文件,支持批量下载和多线程下载。 使用说明: https://blog.csdn.net/qq940390/article/details/89789532
  • if "m3u8" in one_file_name: data_list[0].append(filename + "/" + one_file_name) elif "key" in one_file_name: data_list[1].append(filename + "/" + one_file_name) else: data_list[2].append...
  • Python FFmpeg m3u8解密合成mp4

    千次阅读 2019-09-11 16:10:21
    第一步,分析 m3u8文件 第二步、获取解密key 第三部,解密合成mp4 第四步,按课程重命名 以慕课网下载的视频为例:下载到手机后得到N个.all结尾的文件夹,每个文件夹为一个视频,里面包含多个ts文件,json.txt...

    目录

    第一步,分析 m3u8文件

    第二步、获取解密key

    第三部,解密合成mp4

    第四步,按课程重命名


     

    以慕课网下载的视频为例:下载到手机后得到N个.all结尾的文件夹,每个文件夹为一个视频,里面包含多个ts文件,json.txt,key.hxk,down.m3u

    8。如下图

    第一步,分析 m3u8文件

     分析down.m3u8,

    拿着URI那串地址去请求,提示tonken过期。这边可以用模拟http请求,然后获取到tonken,再请求这串URI,这边嫌麻烦就不做了,但是我们可以去web抓取http请求呀,于是兴高采烈的,打开开发者工具,过滤XHR

    but 得到的是一串被加密过的字符串,并不是AES的key...

    反过来思考,既然下载视频,当然是为了离线观看,所以解密操作必定在客户端。

    首选当然是去反编译App,噼里啪啦下载App,打开jadx,完蛋,卡住了,电脑呼呼的叫,这个方法行不通。

    另外一个web端呢,随便打开一个视频播放,打开开发者工具,找到播放器代码所在文件各种断点,调试

    理论上就是这个js文件,在解密,一键格式化JS复制下来。搜索一下关键字encrypt等等,还真有

    第二步、获取解密key

    把对应的函数拷贝出来保存,死马当活马医。那总得验证一下是不是这个函数,于是,把URI请求得到的值进行解密

    这看起来像个map,但是在js是Uint8Array ,长度刚好是16,总算有所收获。但是在python里面没有这种类型,

    看着和字典类似,试一下,顺便看一下js,Uint8Array 转化为字符串,是通过String.fromCharCode将数字转化为字符,拼接字符。那python肯定也有,了解一下chr()函数,动手:

    注意:需要从key为0的位置,开始读取字典。

    得到字符数组之后,转化为字符串,写到文件video.key,大小只要16B就正确,文件与down.m3u8同级。

    做到这里,似乎漏掉了一个key.hxk文件的存在,里面也是一个字符串,不知道和URI请求下来的一不一样,肉眼能直接看出了,他们不一样,but,解密后呢,于是,我去找到web端对应的播放地址,抓取请求,拿到“Akmq2hpCJ9c+DBCnbRVgCjx93B5zFwcxQr3vBQ==b3P9dO9JYFL3QhQsJjCDexAV”

    key.hxk得到“Z2mkmPmGeWpjNVReDFQiZVT5AxVjHeMeMhVcDXY2ZY4MYz8gyQ==WYb1A7XkJIAv”

    def runJs(str):
        js = execjs.compile(readFile('decypt.js'))
        result = js.call('n', str, 1)
        print result
    if __name__ == '__main__':
       key = "Akmq2hpCJ9c+DBCnbRVgCjx93B5zFwcxQr3vBQ==b3P9dO9JYFL3QhQsJjCDexAV"
       print runJs(key)
       key = "Z2mkmPmGeWpjNVReDFQiZVT5AxVjHeMeMhVcDXY2ZY4MYz8gyQ==WYb1A7XkJIAv"
       print runJs(key)
    

     

    果然,一模一样。到这里,我们已经拿到解密函数和 解密key。

    第三部,解密合成mp4

    这里选用FFmpeg

    命令:ffmpeg -allowed_extensions ALL -i down.m3u8 -c copy output.mp4

    将down.m3u8里面#EXT-X-KEY这行的URI替换成“vide.key”

    执行命令

    喝杯茶,等一小会儿

    当前目录下就生成out.mp4文件,打开播放器,就可以播放了,ffmpeg果然牛批

    第四步,按课程重命名

    打开json.txt,是个json格式字符串

    chapter_seq章,section_seq节,sectionName课程名称

     

     

    展开全文
  • I am trying to concatenate .ts files present in a .m3u8 playlist in python,Is there any way of doing it ??? If yes please do explain howThanks in advance解决方案This should work, I only added two ...

    I am trying to concatenate .ts files present in a .m3u8 playlist in python,

    Is there any way of doing it ??? If yes please do explain how

    Thanks in advance

    解决方案

    This should work, I only added two comments to this short script cause I guess it's pretty much self-explanatory.

    import shutil

    # Parse playlist for filenames with ending .ts and put them into the list ts_filenames

    with open('playlist.m3u8', 'r') as playlist:

    ts_filenames = [line.rstrip() for line in playlist

    if line.rstrip().endswith('.ts')]

    # open one ts_file from the list after another and append them to merged.ts

    with open('merged.ts', 'wb') as merged:

    for ts_file in ts_filenames:

    with open(ts_file, 'rb') as mergefile:

    shutil.copyfileobj(mergefile, merged)

    展开全文
  • ffmpeg 合成 m3u8

    2020-02-26 19:48:49
    ffmpeg -allowed_extensions ALL -i "C:\streamingtest.m3u8" -c copy "test.ts" ffmpeg -i list.m3u8 -c copy -bsf:a aac_adtstoasc ALL.mp4
  • m3u8

    万次阅读 2017-07-13 13:42:07
    1.什么是m3u8?要想知道什么是m3u8最直接最粗暴的方式是找几个m3u8文件拔出来看看就知道。(话说是驴子是马出来溜溜就知道…) 下面我给出了3个m3u8连接: 1.http://cache.utovr.com/201508270528174780.m3u8 2....
  • m3u8文件视频转换器背景介绍小伙伴们有没有发现,网上下载了m3u8格式视频,不能播放很苦恼,所以你现在就只想知道m3u8格式视频用什么播放器能看?m3u8文件格式与mp4之间有什么区别?遇到M3U8视频格式需要专用的m3u8...
  • 在mac上利用python爬虫技术抓取某页面上m3u8格式视频到本地并自动调取mac上的ffmpeg程序将ts文件合成mp4文件,仅供学习参考,blog地址https://blog.csdn.net/Jo_Andy/article/details/89714777
  • 代码如下所示: import os import requests import datetime from Crypto.Cipher import AES def decode_key_file(key_file_name): with open(key_file_name,r) as f: data=f.read() ...
  • m3u8\ts片段文件解密合成转换

    千次阅读 2021-01-26 19:41:56
    简介 参考 直播流m3u8网页怎么下载? [原创工具] M3U8批量下载器 V1.4.6【9月15日更新】 m3u8中ts文件无损批量合并与转换方法
  • python m3u8视频ts解密合成完整mp4

    万次阅读 2018-10-18 17:34:56
    m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过 编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中...
  • java下载m3u8转ts合成mp4

    千次阅读 2020-05-08 17:40:21
    java 基础不太行,就当练习,有能力的话可以写个浏览器获取视频m3u8 package com.huasejj.j; import org.apache.commons.io.FileUtils; import org.junit.Test; import java.io.BufferedReader; import java.io....
  • M3u8Puller 介绍: M3u8Puller是笔者使用c#编写的一款小工具,源自于笔者日常看片偶出卡顿问题,然而在网上很难找到一款好用点的下载工具,故此笔者自写了一款,支持多任务同时下载,支持多线程下载,下载速度非常...
  • 先大家要知道M3U8文件不是一个视频文件,里面全是一些路径,说白了就是一个目录而已,所以要看视频,要找到对应存放视频的文件夹。如果不知道怎么找,可以使用文本格式打开M3U8文件,里面会有路径提示。 文件有...
  • m3u8视频文件下载工具

    2018-10-11 10:37:11
    用于M3U8m3u8格式的文件下载合成可播放的文件,因为依赖的jre没时间压缩稍微大点,正常可用,如果无法正常使用可以私信或者加q群联系
  • M3u8zMP4.zip

    2020-12-15 11:15:34
    M3u8 批量下载神器 下载完成后,自动合成MP4.删除自动BAT文件
  • 所用工具m3u8x.rar

    2020-02-22 09:31:22
    m3u8x的压缩包,用来把一些网站的视频是blob开头的m3u8后缀的视频文件,合成转换下载到本地。解决一些视频无法下载的问题。
  • 使用python 下载m3u8格式视频,并合成

    千次阅读 2018-07-26 07:15:56
    使用python 下载m3u8格式视频,并合成 -- coding: utf-8 -- Created on 2018/07/26 import os import requests """ 下载M3U8文件里的所有片段 """ def download(url): download_path ...
  • M3U8批量下载器 V1.34.2

    2018-08-07 11:35:26
    可以下载m3u8格式视频,视频合成一键直达。M3U8批量下载器
  • 先开调试,输入查找一下有没有 m3u8 文件 然后下下来用Notepad++ 打开一下 (以下的样子) 这里就是整个视频的视频流, .ts 的都是文件,都下下来, --------------------------------------------------------...
  • m3u8视频下载合并工具

    2018-06-20 11:59:50
    m3u8视频下载合并工具,输入网址可直接将零散的缓存视频下载成m3u8视频文件,省去了UC、搜狗等浏览器缓冲后,还要用软件去合并的时间,一步到位。
  • 使用开源软件ffmpeg合并m3u8文件,导出手机里的m3u8文件片段,编辑m3u8文件内容,改路径,最后使用ffmpeg命令行,将文件合并为一个文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 871
精华内容 348
关键字:

m3u8合成