澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:python完毕m③u八格式转变

最近发现一些网站,可以解析各大视频网站的vip。仔细想了想,这也算是爬虫呀,爬的是视频数据。

切片工具:ffmpeg

版权声明:本文为博主原创文章,未经博主允许不得转载。

1、安装ffmpeg

brew install ffmpeg

python实现m3u8格式转换为mp4视频格式,pythonm3u8

开发动机:最近用手机QQ浏览器下载了一些视频,视频越来越多,占用了手机内存,于是想把下载的视频传到电脑上保存,可后来发现这些视频都是m3u8格式的,且这个格式的视频都切成了碎片,存在电脑里不方便查看,于是想把它转换为其他可以直接打开播放的完整视频,到网上找了一些工具,都不怎么好用,后来发现一个手机端的“缓冲合并工具”,倒是可以用,但是合并的视频顺序是乱的,碎片的视频顺序还需要用户手动调整,感觉太耽误时间了,于是自己打算写一个转换工具。

直接上代码:(程序的文件名为:convert_m3u8.py)   

# -*- coding:utf-8 -*- 
import sys 
import os 
from glob import glob 
#获取需要转换的路径 
def get_user_path(argv_dir): 
  if os.path.isdir(argv_dir): 
    return argv_dir 
  elif os.path.isabs(argv_dir): 
    return argv_dir 
  else: 
    return False 
#对转换的TS文件进行排序     
def get_sorted_ts(user_path): 
  ts_list = glob(os.path.join(user_path,'*.ts')) 
  #print(ts_list) 
  boxer = [] 
  for ts in ts_list: 
    if os.path.exists(ts): 
      #print(os.path.splitext(os.path.basename(ts))) 
      file,_ = os.path.splitext(os.path.basename(ts)) 
      boxer.append(int(file)) 
  boxer.sort() 
  #print(boxer) 
  return boxer 
#文件合并   
def convert_m3u8(boxer,o_file_name): 
  #cmd_arg = str(ts0) " " str(ts1) " " o_file_name 
  tmp = [] 
  for ts in boxer: 
    tmp.append(str(ts) '.ts') 
  cmd_str = ' '.join(tmp) 
  exec_str = "copy /b " cmd_str ' ' o_file_name 
  #print("copy /b " cmd_str ' ' o_file_name) 
  os.system(exec_str) 


if __name__=='__main__': 
  #print(sys.argv[1:]) 
  argv_len = len(sys.argv) 
  if argv_len == 3: 
    o_dir,o_file_name =sys.argv[1:] 
    #print(o_dir ":" o_file_name) 
    user_path = get_user_path(o_dir) 
    #print(user_path) 
    if not user_path: 
      print("您输入的路径不正确,:-("); 
    else: 
      if os.path.exists(os.path.join(user_path,o_file_name)): 
        print('目标文件已存在,程序停止运行。') 
        exit(0) 
      os.chdir(user_path) 
      #convert_m3u8('2.ts','4.ts',o_file_name) 
      boxer = get_sorted_ts(user_path) 
      convert_m3u8(boxer,o_file_name) 
      #print(os.getcwd()) 
  else: 
    print("参数个数非法"); 

注:代码不多,原理也很简单,就是把各个碎片视频按照顺序合并为一个视频文件。
澳门新浦京娱乐场网站,使用方法如下:

python  convert_m3u8.py    m3u8视频的目录   要转换后文件的名字

其中第一个参数为m3u8视频的目录(m3u8的碎片视频在手机里是隐藏的,需要将隐藏文件显示出来才可以将文件导出到电脑里,在安卓手机里将隐藏文件夹前面的.重命名去掉就可以了),第二个参数为要转换后文件的名字。

澳门新浦京娱乐场网站 1

澳门新浦京娱乐场网站 2

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持帮客之家。

开发动机:最近用手机QQ浏览器下载了一些视频,视频越来越多,占用了手机内存,于是想把...

 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 “一出好戏” 。

任务:将aaa.mp4切片成m3u8和ts切片(亲测wmv,mp4可用)

主流视频APP的视频缓存有着不同的存储方案,下面一一进行分析。

2. 安装ffmpeg依赖

查看安装信息

brew info ffmpeg

会显示依赖安装情况❌ 表示未安装

brew install 需要安装的依赖

分析页面

我用的是chrome浏览器,F12进入查看。选择NetWork的Doc,发现主体部分的数据是从这个网站获取的。

澳门新浦京娱乐场网站 3

 

在地址栏输入这个链接,跳转到了视频来源的播放页面。

当然,在这个页面就可以直接观看视频了,但是我们要把视频下载下来。

澳门新浦京娱乐场网站 4

主流视频APP下载电影电视剧一般都对内存的占用较大。对于较大的视频文件的存储,一种方法就是将视频文件分成大小相似的很多个小视频然后逐个下载,也叫伪流媒体。较为常见的一种是mp4格式作为视频的存储格式。这种伪流媒体采用普通的http方式,不像真实的流媒体协议传输格式rtsp,那样的话得搭建与门的流媒体服务器,成本比较高。同时这种方法还能实现边下载边播放的功能。要想实现这个功能,原则上就要求视频的存储格式是分段的,而mp4正好满足这个要求,只要将mp4的整体视频信息放在mp4文件的开头,这样只要加载了mp4文件的头部之后,就能解析出该mp4文件的时长,比特率等等,为后续的视频缓存做初始化设置,然后每加载一部mp4文件的数据流,通过解析头部来获得当前视频流的帧信息,并在播放器中播放。

3. 视频转换

查看视频信息,只有视频编码h.264,音频编码aac的mp4视频可以转m3u8

ffprobe trailer.mp4(视频文件 后缀 我的源文件就是mp4)

显示如下信息

  ffprobe version 3.4 Copyright (c) 2007-2017 the FFmpeg developers
  built with Apple LLVM version 9.0.0 (clang-900.0.37)
 configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --    host-cflags= --host-ldflags= --enable-gpl --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma
 libavutil      55. 78.100 / 55. 78.100
 libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
  Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'trailer.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2017-11-27T13:16:02.000000Z
    Duration: 00:04:02.47, start: 0.000000, bitrate: 10342 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 10018 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
     Metadata:
      creation_time   : 2017-11-27T13:16:02.000000Z
       handler_name    : Alias Data Handler
     encoder         : AVC Coding
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
    Metadata:
     creation_time   : 2017-11-27T13:16:02.000000Z
      handler_name    : Alias Data Handler

视频转mp4

ffmpeg -i 视频源文件.后缀 -acodec copy -vcodec copy out.mp4

视频如果太大可以压缩

ffmpeg -i input_file -s 320x240 output_file

分辨率自己看着改

mp4转ts

ffmpeg -i out.mp4 -c copy -bsf:v h264_mp4toannexb output.ts

视频切片

ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 5 outputd.ts

命令里边的5为每段视频5秒,可自行调整,完成之后会生成一个playlist.m3u8和一堆.ts,切片到这里就完成了。

寻找视频文件

仍然是之前那个页面,在Other中,我们发现了一些奇怪的东西。

澳门新浦京娱乐场网站 5

查一下,m3u8是个啥东西。

m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过 编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求。

这下就清楚了,这就是我们要找的东西。

点击Response,查看这个.m3u8的文件。观察发现,.ts后缀的文件地址是有规律的。我们只需要下载所有的.ts后缀文件,然后把它们整合成一个文件即可。

步骤:

因此,大视频文件的路径选择方法可以是许多个小文件的叠加,而每个小文件都可以独立选择存储路径,最后只要将组成同一个视频的小文件进行合并就可以。

4. 页面插入视频

试了两种方式
一种是video.js videojs-contrib-hls.js
这种方式不兼容IE10-
video.js
videojs-contrib-hls

<video id=example-video width=960 height=540 class="video-js vjs-default-skin" controls>
    <source src="./video/playlist.m3u8" type="application/x-mpegURL">
</video>
<script src="video.js"></script>
<script src="videojs.hls.min.js"></script>
<script>
    var player = videojs('example-video');
    player.play();
</script>

另一种方式用ckplayer
官网:http://www.ckplayer.com/
下载之后解压找到crossdomain.xmlckplayer文件夹放到根目录下

<script type="text/javascript" src="ckplayer/ckplayer.js"></script>
<div id="video" style="width:600px;height:400px;"></div>
<script>
    var videoObject = {
        container:'#video',
        variable:'player',
        autoplay:true, //强制使用ckplay做播放器
        video:'./video/playlist.m3u8'
    };
    var player=new ckplayer(videoObject);
<script>

视频会带ckplay的水印,但是不影响。

澳门新浦京娱乐场网站:python完毕m③u八格式转变为mp3摄像格式,录像切成条转m三u八。合并.ts文件

命令行:“copy /b  F:f*.ts  E:fnew.ts”。

执行该命令后,F:f目录下的全部TS文件就被合并成一个new.ts文件了(你原来的那堆文件仍然存在)。

这里使用copy命令的文件合并功能进行ts文件的合并,copy后面的 /b  参数表示把文件按二进制格式来合并,如果不加这个参数,则会把目标当成文本文件来合并,并在文件内添加不必要的标记,这会导致播放出错,所以必须加 /b 参数。

1.下载ffmpeg命令工具(绿色安装)

1.优酷

以小米5为例,进行一个大小为135M的视频的缓存。

Paste_Image.png

如上,所下载的视频的文件夹是左图,此文件夹的内容如右图所示,可以看出优酷也是将大视频文件分割成许多个小视频文件,但是图中的名字为1-7的文件并非mp4,而是.ts文件。该存储方式是m3u8格式。 m3u8是m3u的一种,是一种播放的标准。它是一种可扩展的播放列表文件格式。m3u是包含媒体文件URL的一个事实上的播放列表标准。这种格式被用来作为HTTP Live 媒体流索引文件的格式。 m3u8包含UTF-8编码文字的m3u播放列表,所有的原始视频文件都被下载到一个隐藏文件夹了。点击m3u8文件就会自动把这些 .ts文件链接在一起播放,可以用notepad 打开m3u8文件查看内容,里面是一个个本地文件的链接,这些链接指向一个个小视频文件,也就是说你找不到原来下载这个文件的网址了。
如果想直接播放完整的原始视频文件就要找到那个文件夹,里面的视频文件是一段一段的,先合并成一个完整的视频文件,然后就可以播放了。当然,如果删除了那个隐藏文件夹,那这个m3u8文件也就没用了,点击播放会提示解析失败。
其他测试机型类同。

编写脚本,下载.ts文件

from urllib import request
import urllib
from time import sleep
import socket

class CatchVideo(object):
    def __init__(self):
        self.headers = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"
        self.url = ""

    def set_url(self, i):
        if i < 1000:
            self.url = "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412d.ts" % i
        else:
            self.url = "https://cdn.letv-cdn.com/20180811/YLDUgCD6/1000kb/hls/DtrOg2412d.ts" % i

    # 获取并下载ts文件
    def dl_ts(self, i):
        rq = request.Request(self.url)
        rq.add_header('User-Agent', self.headers)
        response = request.urlopen(rq)
        resread = response.read()
        with open(str(i) ".ts", "wb") as f:
            f.write(resread)
        response.close()# 关闭urlopen方法,防止被ban

    def start_work(self):
        for i in range(0, 1563 1):
            self.set_url(i)
            try:
                self.dl_ts(i)
                print(str(i)   ".ts  success")
                sleep(1)
            except urllib.error.URLError as e:
                print(e.reason)
                break
            except socket.timeout as e2:
                print(e2.reason)
                self.dl_ts(i)


if __name__ == '__main__':
    catch_video = CatchVideo()
    socket.setdefaulttimeout(20)
    catch_video.start_work()

 

运行过程中,出现了两次报错,分别是:

  • urllib.error.URLError :[WinError 10054]  远程主机强迫关闭了一个现有的连接
  • socket.timeout     read读取超时

解决办法:

  1.增加response.close,关闭urlopen方法。

  2.增加time.sleep,有一秒缓冲时间

  3.设置socket.setdefaulttimeout,给socket预留缓冲时间

澳门新浦京娱乐场网站 6

2.爱奇艺

缓存一个大小为5.6M的资讯类视频

Paste_Image.png

如上,所下载的视频的文件夹是左图的第一个文件夹,此文件夹的内容如右图所示,可以看出视频是由一个后缀名为".qsv"的文件构成。

用其他测试机也类似,而并没有进行大视频文件的分割。 通过查找资料可得:qsv是一种视频加速格式。qsv格式是爱奇艺公司研发的一种视频文件格式,由亍爱奇艺全面正版视频,故qsv格式只能使用奇艺播放器(爱奇艺影音)播放,不能通过普通的格式转换软件进行转换。

还存在问题

实际运行过程中,脚本执行效率略低。之后会加入多线程,继续改进,增加运行效率。

 

 

下载ffmpeg命令工具

3.腾讯视频

用腾讯视频下载一个大小为91.6M的电视剧(一集)。

Paste_Image.png

所下载的视频的文件夹是左图的第二个.sd文件夹,此文件夹的内容如右图所示,可以看出每下载一个视频就在左图路径下创建一个新的文件夹。文件夹下的视频是由多个mp4格式的视频文件构成的。 其他测试机型类同。

参考博客:

 

 

 

2.解压

4.搜狐视频

用搜狐视频缓存一个大小为159.4M的综艺类视频。

Paste_Image.png

如上,所下载的视频的文件夹是左图的第一个文件夹,此文件夹的内容如右图所示,可以看出每下载一个视频就在左图路径下创建一个新的文件夹,而且缓存的格式为m4u8。 m4u8是m4u的一种,与m3u8类似。这种文件包含链接到MPEG - 4电影和视频剪辑,但不包含视频文件本身,类似于一个M3U文件,存储播放列表的视频文件。

更新代码,加入多进程

修改了start_work方法和主进程:

    def start_work(self, i):
        self.set_url(i)
        try:
            self.dl_ts(i)
            print(str(i)   ".ts  success")
            sleep(1)
        except urllib.error.URLError as e:
            print(e.reason)
            self.dl_ts(i)
        except socket.timeout as e2:
            print(e2.reason)
            self.dl_ts(i)


if __name__ == '__main__':
    catch_video = CatchVideo()
    socket.setdefaulttimeout(20)# 设置socket层超时时间20秒
    I = 0
    while I < 1563 1:
        # 5个进程并发运行
        p_l = [Process(target=catch_video.start_work, args=(i,)) for i in range(I, I 5)]
        for p in p_l:
            p.start()
        for p in p_l:
            p.join()
        I = I   5

 

 

这里设置了5个进程同时运行,太多远程主机会拒绝请求。

 

OK,这样就能很快下载了。隔了几天终于想起来还有个电影没看,哈哈 ^_^

 

 

 

 

澳门新浦京娱乐场网站 7

5.乐视视频

以小米5为例,进行一个大小为135M的电影视频和每集大小约为50M的电视剧(共5集)的缓存。

Paste_Image.png

如上,是左图所下载的视频列表,共6个视频。右图是对应的文件夹的内容,可以看出在手机内存中新建的LetvDownload/storage/download保存。下载新视频并不会创建一个新的文件夹,直接保存在该目录下,且大视频文件(如右图第一个)不进行分割。保存格式为mp4。 另外,在乐视手机上测试时视频缓存路径有所不同,为 手机内存/ledown 应该是由于APP版本与其他机型的版本差距过大。

解压

6.土豆视频

以小米5为例,进行一个大小为490.4M的电影视频和大小为3.4M的新闻视频的缓存。

Paste_Image.png

上方的图是两个视频文件的文件夹,下方左图是第一个文件夹的内容(3.4M的新闻视频),下方右图是第二个文件夹的内容(490.4M的电影视频)。通过不其他测试机型的比较,可以得出结论:土豆视频下载视频会创建新的文件夹,在下载小视频文件时,使用m3u8的视频格式,而在下载较大的视频时,使用mp4视频格式,同时会将大文件分割成多个mp4文件存储,合并时通过查找m3u8的列表文件播放mp4。

澳门新浦京娱乐场网站 8

不同视频应用比较如下:

Paste_Image.png

Paste_Image.png

Paste_Image.png

综上所述,可以看出不同视频应用选择的存储路径主要分成两大类:一类是存储在手机内存根目录下的文件夹,另一类是存储在手机内存/Android/data/包名下的文件夹,关亍这两种方法的不同描述如下:

第一类的文件属于公共文件。文件是可以被自由访问,且文件的数据对其他应用或者用户来说都是有意义的,当应用被卸载后,其卸载前创建的文件仍然保留。如果你想在外存储上放公共文件你可以使用getExternalStoragePublicDirectory()这个方法。而第二类的文件属于私有文件。所有应用程序的外部存储的私有文件都放在根目录的Android/data/下,其实由于是外部存储的原因即是是这种类型的文件也能被其他程序访问,只不过一个应用私有的文件对其他应用其实是没有访问价值的(恶意程序除外)。外部存储上,应用私有文件的价值在亍卸载之后,这些文件也会被删除。类似于内部存储。

目录

澳门新浦京娱乐场网站 9

切片工具

3.使用

a.curl R

澳门新浦京娱乐场网站 10

b.切换到刚才解压的盘符,比如我放在d盘:(此处我没有配置环境变量,配置环境变量后,可以在任何位置进行,不需要切换目录)

澳门新浦京娱乐场网站 11

c.切换到刚才要使用工具的目录下,比如我ffmpeg.exe所在的目录是“D:ffmpegffmpeg-20171218-3f88744-win64-staticbin”:

澳门新浦京娱乐场网站 12

d.使用命令:ffmpeg -i XXX.mp4 -c:v libx264 -c:a copy -f hls XXX.m3u8

其中,XXX.mp4为本地视频文件,XXX.m3u8为最终生成的播放索引列表,与此同时还有N多个ts文件。比如,我这里要执行的是ffmpeg -i aaa.mp4 -c:v libx264 -c:a copy -f hls bbb.m3u8

澳门新浦京娱乐场网站 13

执行成功后在本目录下就可以看到一个m3u8文件和一大堆的ts文件。

澳门新浦京娱乐场网站 14

经过测试,发现mp4和mkv的ts切片都可以播放,但是avi的ts切片只有声音没有图像,原因暂不明,猜测与视频编码有关,后期深入研究。

其他命令:

ffprobe aaa.mp4(文件名):查看文件编码方式

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:python完毕m③u八格式转变