python 实现视频流下载保存MP4的方法


Posted in Python onJanuary 09, 2019

如下所示:

# -*- 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的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
python字典基本操作实例分析
Jul 11 Python
关于反爬虫的一些简单总结
Dec 13 Python
快速了解Python相对导入
Jan 12 Python
python针对excel的操作技巧
Mar 13 Python
Python解析并读取PDF文件内容的方法
May 08 Python
pandas取出重复数据的方法
Jul 04 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
Pycharm生成可执行文件.exe的实现方法
Jun 02 Python
如何表示python中的相对路径
Jul 08 Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 #Python
Python Pywavelet 小波阈值实例
Jan 09 #Python
python利用小波分析进行特征提取的实例
Jan 09 #Python
Python 实现中值滤波、均值滤波的方法
Jan 09 #Python
对Python信号处理模块signal详解
Jan 09 #Python
使用python实现语音文件的特征提取方法
Jan 09 #Python
对python中Librosa的mfcc步骤详解
Jan 09 #Python
You might like
php实现求相对时间函数
2015/06/15 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
JavaScript中的私有成员
2006/09/18 Javascript
jquery 分页控件实现代码
2009/11/30 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
欧舒丹英国官网:购买欧舒丹护手霜等明星产品
2017/01/17 全球购物
清洁工岗位职责
2014/01/29 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
python_tkinter事件类型详情
2022/03/20 Python