网络编程
位置:首页>> 网络编程>> Python编程>> python 实现视频流下载保存MP4的方法

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

作者:huaqiangu1123  发布时间:2021-09-13 06:31:38 

标签:python,视频流,MP4

如下所示:


# -*- 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

来源:https://blog.csdn.net/huaqiangu1123/article/details/78790717

0
投稿

猜你喜欢

  • 使用xhtml+css布局经常性地会使用到float,很多邪门的事儿都有可能是浮动在作怪,那么清除浮动就是必须要做的,而且随时性地对父级元素
  • 忙碌了一年,今天终于放假了。原本打算好好休息一下,没成想只过了半天就觉得有点无聊。看家人和朋友们都在忙年,那我就用OpenGL导演一场烟花盛
  • 以下列出了两种数据库的方法:ASP+Access20001.要获取的ID值字段属性必须设为:自动编号(我们假设字段名为recordID)2.
  • 整个重装步骤大致分四个步骤进行,第一步,备份原mysql中的所有数据库。第二步,完全卸载mysql第三步,下载安装新版mysql第四步,导入
  • 废话不多说了,直接给大家贴代码了。编写setup.py后$ python setup.py register$ python setup.p
  • 人一旦习惯了某些东西就很难去改,以及各种各样的原因,新的浏览器越来越多,而老的总淘汰不了。增长总是快于消亡导致了浏览器兼容是成了谈不完的话题
  • 最近社会猪可是火遍了大江南北,不蹭下热度可对不起它。见过手画的佩奇,见过用代码画的吗?没有?那就来看我大显身手。用python的turtle
  • 一、io包中接口的好处和优势1.1拷贝数据的函数io.Copy(dst Writer, src Reader)io.CopyBuffer(d
  • django 模版显示的html中出现&#39;类似的ascii字符,这是由于django对单引号进行了转义,可以通过关闭转 * 决h
  • 只要你的Web开发知识不是语文老师教的,那么你应该已经知道一个合格的开发者应该永远抱着怀疑的眼光看用户提交的数据。你不仅需要在前端通过表单或
  • 一.基本概念事务是指满足ACID特性的的一组操作,可以通过Commit提交事务,也可以也可以通过Rollback进行回滚。会存在中间态和一致
  • 1、打开文件open()函数简介 :打开文件使用open函数,可以打开一个已经存在的文件,如果没有这个文件的话,会创建一个新文件完整的语法格
  • 前言今天就给大家介绍四个你不怎么常用排序函数,他们就是SQL Server排序中经常用到的ROW_NUMBER(),RANK(),DENSE
  • 1.lxml库简介lxml 是 Python 常用的文档解析库,能够高效地解析 HTML/XML 文档,常用于 Python 爬虫。lxml
  • 目录概述索引数据结构二叉树红黑树B-TreeB+TreeHash索引InnoDB 索引实现(聚集)索引文件和数据文件是分离的(非聚集)聚集索
  • 本文实例为大家分享了python实现简易五子棋游戏的具体代码,供大家参考,具体内容如下运行效果: 完整代码+注释: fi
  • 互斥锁在Golang中,互斥锁(Mutex)是一种基本的同步原语,用于实现对共享资源的互斥访问。互斥锁通过在代码中标记临界区来控制对共享资源
  • 在设计中保持一致性(uniformity)是网页设计中一个重要的组成部分,它能使你的设计有效地传达信息而不会导致用户迷惑或焦虑。保证一致性的
  • 字典dict1 = {'name':'han','age':18,'class
  • 1、从半年以前要“去中心化”开始,豆瓣作了不少大的调整,重要的是上线了很多的新功能。同城、日记、相册、音乐试听、等等。2、一个多月来,豆瓣上
手机版 网络编程 asp之家 www.aspxhome.com