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执行外部程序的常用方法小结
Mar 21 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
Python中join函数简单代码示例
Jan 09 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
Python 多进程、多线程效率对比
Nov 19 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 Python
Python中X[:,0]和X[:,1]的用法
May 10 Python
Django与数据库交互的实现
Jun 03 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
基于mysql的bbs设计(二)
2006/10/09 PHP
PHP中基本符号及使用方法
2010/03/23 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
javascript 闭包
2011/09/15 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
Python常用模块介绍
2014/11/21 Python
Python入门之modf()方法的使用
2015/05/15 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
PyTorch中的C++扩展实现
2020/04/02 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
酒店管理毕业生自我鉴定
2014/03/02 职场文书
气象学专业个人求职信
2014/03/15 职场文书
后备干部培训方案
2014/05/22 职场文书
创先争优个人承诺书
2014/08/30 职场文书
开发房地产协议书
2014/09/14 职场文书
民事起诉状范文
2015/05/19 职场文书
Python爬虫实战之爬取携程评论
2021/06/02 Python
Nginx安装配置详解
2022/06/25 Servers