如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
# -*- coding:utf-8 -*-
import sys
import os
from glob import glob
import requests
reload (sys)
sys.setdefaultencoding( "utf-8" )
file_path = os.getcwd()
#获取需要转换的路径
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' ))
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))
print file
boxer.append( file )
# boxer.append(int(file))
boxer.sort()
print (boxer)
return boxer
#文件合并
def convert_m3u8(file_path,boxer,o_file_name):
print u "开始拼接视频"
new_path = file_path + "/" + u "视频"
try :
os.chdir(new_path)
except Exception, e:
os.mkdir(new_path)
tmp = []
for ts in boxer:
print ts
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.chdir(user_path)
os.system(exec_str)
print "go home path"
import shutil
shutil.move(o_file_name,new_path + "/" + o_file_name)
os.chdir(file_path)
reload (sys)
sys.setdefaultencoding( 'utf-8' )
# 功能:爬取m3u8格式的视频
# 检查存储路径是否正常
def check_path(_path):
# 判断存储路径是否存在
if os.path.isdir(_path) or os.path.isabs(_path):
# 判断存储路径是否为空
if not os.listdir(_path):
return _path
else :
print u '>>>[-] 目标文件不为空,将清空目标文件,是否更换路径?'
flag = raw_input ( '>>>[*] Yes:1 No:2 \n>>>[+] [2]' )
try :
if flag = = '1' :
_path = raw_input ( unicode ( '>>>[+] 请输入目标文件路径。\n>>>[+] ' ).encode( 'gbk' ))
check_path(_path)
else :
# 清空存储路径
os.system( 'rd /S /Q ' + _path)
os.system( 'mkdir ' + _path)
return _path
except Exception as e:
print e
exit( 0 )
else :
os.makedirs(_path)
return _path
# 获取ts视频的爬取位置
def get_url(_url, _path):
all_url = _url.split( '/' )
url_pre = '/' .join(all_url[: - 1 ]) + '/'
url_next = all_url[ - 1 ]
os.chdir(_path)
# 获取m3u8文件
m3u8_txt = requests.get(_url, headers = { 'Connection' : 'close' })
with open (url_next, 'wb' ) as m3u8_content:
m3u8_content.write(m3u8_txt.content)
# 提取ts视频的url
movies_url = []
_urls = open (url_next, 'rb' )
for line in _urls.readlines():
if '.ts' in line:
movies_url.append(url_pre + line[: - 1 ])
else :
continue
_urls.close()
return movies_url
# 爬取ts视频
def download_movie(num,movie_url, _path):
os.chdir(_path)
print u '>>>[+] 第{}个视频 downloading...' . format (num)
print '-' * 60
error_get = []
for _url in movie_url:
# ts视频的名称
movie_name = _url.split( '/' )[ - 1 ][ - 6 :]
movie_name1 = _url.split( '_' )[ - 1 ][ - 6 :]
# print movie_name2
if len ( str (movie_name1))< = 4 :
movie_name1 = "00" + str (movie_name1)
elif len ( str (movie_name1))< = 5 :
movie_name1 = "0" + str (movie_name1)
else :
movie_name1 = str (movie_name1)
try :
# 'Connection':'close' 防止请求端口占用
# timeout=30 防止请求时间超长连接
movie = requests.get(_url, headers = { 'Connection' : 'close' }, timeout = 60 )
with open (movie_name1, 'wb' ) as movie_content:
movie_content.writelines(movie)
print u '>>>[+] 视频片段 ' + movie_name1 + u ' 下载完成'
# 捕获异常,记录失败请求
except :
error_get.append(_url)
continue
# 如果没有不成功的请求就结束
if error_get:
print u '共有%d个请求失败' % len (file_list)
print '-' * 60
download_movie(error_get, _path)
else :
print '>>>[+] Download successfully!!!'
url = [ "http://video.renrenjiang.cn/record/alilive/7684990805-1512186274.m3u8" ]
if __name__ = = '__main__' :
try :
# _url = raw_input(unicode('>>>[+] 请输入指定的[.m3u8]目标URL。\n>>>[+] ').encode('gbk'))
# _path = raw_input(unicode('>>>[+] 请输入存储目标文件路径。\n>>>[+] ').encode('gbk'))
for i in range ( len (url)):
_url = url[i]
_path = os.getcwd() + "/" + "ts" + str (i + 5 )
try :
os.chdir(_path)
except Exception, e:
os.mkdir(_path)
storage_path = check_path(_path)
movie_url = get_url(_url, storage_path)
download_movie(i + 1 ,movie_url, storage_path) #下载视频
user_path = _path
o_file_name = str (i + 5 ) + ".mp4"
boxer = get_sorted_ts(user_path)
convert_m3u8(file_path,boxer,o_file_name) #拼接视频
except Exception as e:
print e
|
以上这篇python 实现视频流下载保存MP4的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/huaqiangu1123/article/details/78790717