# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ m3u8
# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ oss2
# pip3 install --upgrade pip # 在Centos中安装ffmpeg和aria2c
# https://www.cnblogs.com/littlehb/p/9347978.html import m3u8, sys
import os, subprocess
import oss2, requests, datetime # ========================================================================
# 前面需要截取的时间长度,单位:秒
prefixCutSeconds = 10
# 后面需要截取的时间长度,单位:秒
suffixCutSeconds = 5
# 上传的路径前缀
prefix = 'down/M3u8_ZhengZhou103/' # ========================================================================
# 访问oss的用户名与密码,无需修改
access_key_id = 'xxxxxxxxxxxx'
access_key_secret = 'xxxxxxxxxxxx'
bucket_name = 'dsideal-yy' # 检查是内网还是外网
def CheckInOut():
# 探测内网外网
print('正在探测使用环境是阿里云内网还是外网,请稍等...')
url = 'http://' + bucket_name + '.oss-cn-qingdao-internal.aliyuncs.com/down/Material/42/42385DBE-E03F-FF6A-A37C-CC8A04612BE4.doc'
try:
requests.get(url, timeout=1)
endpoint = 'http://oss-cn-qingdao-internal.aliyuncs.com/'
print('内部网络访问,将使用endpoint:' + endpoint)
except Exception as err:
endpoint = 'http://oss-cn-qingdao.aliyuncs.com/'
print('外网访问,将使用endpoint:' + endpoint)
return endpoint # 从哪个结点下进行操作
endpoint = CheckInOut() # 从哪里下载回来,如果是内网,应该写成 http://dsideal_yy.oss-cn-qingdao-internal.aliyuncs.com
if 'internal' in endpoint:
downloadPrefixUrl = 'http://' + bucket_name + '.oss-cn-qingdao-internal.aliyuncs.com/down/M3u8/'
else:
downloadPrefixUrl = 'http://' + bucket_name + '.oss-cn-qingdao.aliyuncs.com/down/M3u8/' # 获取视频的时间长度
def GetVideoLength(fileName):
cmd = "ffmpeg -i " + fileName + " 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
return (line.decode()[0:8]) # 将时间换算成秒数
def t2s(t):
h, m, s = t.strip().split(":")
return int(h) * 3600 + int(m) * 60 + int(s) # 下载m3u8的所有ts文件
def DoActionM3u8(m3u8_url):
# m3u8文件的真实名称
m3u8FileName = WorkingPath + "/" + m3u8_url.split('/')[-1]
print('M3u8真实文件名称:' + m3u8FileName)
# 构造两个文本文件
m3u8List = []
m3u8FileList = []
m3u8_obj = m3u8.load(m3u8_url)
for l in m3u8_obj.segments:
m3u8List.append(downloadPrefixUrl + l.uri[0:2] + '/' + l.uri)
m3u8FileList.append("file '" + l.uri + "'") # 形成文本文件,这个用于调用aria2c进行批量下载使用
tempFile = WorkingPath + '/url.txt'
result = map(lambda x: x.strip() + '\n', m3u8List)
with open(tempFile, 'w') as f:
f.writelines(result) # 下载回来转码后的视频ts
cmd = 'aria2c -c -s 4 -d ' + WorkingPath + ' -j 8 -i ' + tempFile
os.system(cmd) # 形成文本文件,用于将ts文件拼接成大的ts文件时使用
tempFile = WorkingPath + '/mylist.txt'
result = map(lambda x: x.strip() + '\n', m3u8FileList)
with open(tempFile, 'w') as f:
f.writelines(result) # 使用ffmpeg 拼成大的ts
tempAllTs = WorkingPath + '/output.ts'
if os.path.exists(tempAllTs):
os.remove(tempAllTs) tempAllTs_new = WorkingPath + '/output_new.ts'
if os.path.exists(tempAllTs_new):
os.remove(tempAllTs_new) tempAllMp4 = WorkingPath + '/output.mp4'
if os.path.exists(tempAllMp4):
os.remove(tempAllMp4) tempAllMp4_new = WorkingPath + '/output_new.mp4'
if os.path.exists(tempAllMp4_new):
os.remove(tempAllMp4_new) # 拼接为原始的ts
cmd = 'ffmpeg -f concat -i ' + tempFile + ' -c copy ' + tempAllTs + ' -y'
os.system(cmd)
#
# 将大的ts转为mp4
cmd = 'ffmpeg -i ' + tempAllTs + ' -c:v copy -c:a copy -bsf:a aac_adtstoasc ' + tempAllMp4
os.system(cmd)
os.remove(tempAllTs)
# 以下为new的步骤=========================================================================
#
# 截取一部分
# (1) 测出文件有多长
videoLength = GetVideoLength(tempAllMp4)
# 去掉后suffixCutSeconds秒
seconds = t2s(videoLength) - suffixCutSeconds
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
endTime = "%02d:%02d:%02d" % (h, m, s) # 开始的秒数
m, s = divmod(prefixCutSeconds, 60)
h, m = divmod(m, 60)
startTime = "%02d:%02d:%02d" % (h, m, s)
# #
# # (2)去头部prefixCutSeconds秒,尾部suffixCutSeconds秒
print('截取并生成mp4!')
cmd = 'ffmpeg -i ' + tempAllMp4 + ' -vcodec copy -acodec copy -ss ' + startTime + ' -to ' + endTime + ' ' + tempAllMp4_new + ' -y'
os.system(cmd)
os.remove(tempAllMp4)
print('生成新mp4成功!到这里都是非常正常的!!!!!') # (3) mp4 转 ts
cmd = 'ffmpeg -y -i ' + tempAllMp4_new + ' -vcodec copy -acodec copy -vbsf h264_mp4toannexb ' + tempAllTs_new
os.system(cmd)
os.remove(tempAllMp4_new) # (4) 切割ts
prefixName = m3u8_url.split('/')[-1][0:36]
cmd = 'ffmpeg -i ' + tempAllTs_new + ' -c copy -map 0 -f segment -segment_list ' + WorkingPath + '/' + prefixName + '.m3u8 -segment_time 10 ' + WorkingPath + '/' + prefixName + '%03d.ts'
os.system(cmd)
os.remove(tempAllTs_new) # (5)上传到oss,放到另一个目录下
path = os.listdir(os.getcwd()+'/M3u8')
for filename in path:
if os.path.isfile(WorkingPath+'/'+filename):
if '.m3u8' in filename or '.ts' in filename:
logInfo('开始进行文件上传:' + filename)
key = prefix + filename[0:2] + '/' + filename
bucket.put_object_from_file(key, WorkingPath + '/' + filename, progress_callback=percentage)
print('文件上传云存储成功完成!' + filename) # 黄海定义的输出信息的办法,带当前时间
def logInfo(msg):
i = datetime.datetime.now()
print(" %s %s" % (i, msg)) # 进度条功能
def percentage(consumed_bytes, total_bytes):
if total_bytes:
per = int(100 * (float(consumed_bytes)) / (float(total_bytes)))
s1 = "\r[%s%s]%d%%" % ("=" * int(per), " " * (100 - int(per)), per)
sys.stdout.write(s1)
sys.stdout.flush() if __name__ == '__main__':
# 删除临时目录并重新创建
WorkingPath = '/usr/local/software/TestM3u8/M3u8'
os.system('rm -rf ' + WorkingPath)
os.mkdir(WorkingPath) # 构建OSS存储对象
auth = oss2.Auth(access_key_id, access_key_secret)
# 阿里云上应该用这个内部网络选项
bucket = oss2.Bucket(auth, endpoint, bucket_name) # 以一个名师云课为例
m3u8_url = downloadPrefixUrl+'C4/C4CD770E-C98A-AF8C-8B53-8541210B355B.m3u8'
print(m3u8_url)
DoActionM3u8(m3u8_url)
# http://video.edusoa.com/down/M3u8_ZhengZhou103/C4/C4CD770E-C98A-AF8C-8B53-8541210B355B.m3u8
# http://dsideal-yy.oss-cn-qingdao.aliyuncs.com/down/M3u8_ZhengZhou103/C4/C4CD770E-C98A-AF8C-8B53-8541210B355B.m3u8
#

去掉m3u8的片头和片尾的更多相关文章

  1. 去掉utf-8的Bom头:使用java以及jdbc不使用第三方库执行sql文件脚本

    package com.xxx.xxx.dao; import java.io.BufferedReader; import java.io.File; import java.io.FileInpu ...

  2. Python实现视频片头和片尾添加

    import imageio imageio.plugins.ffmpeg.download() from datetime import datetime import os from moviep ...

  3. Python调用ffpmeg和ffprobe处理视频文件

    需求: 运营有若干批次的视频.有上千个,视频文件,有mp4格式的,有ts格式的 现在有需要去掉视频文件片头和片尾的批量操作需求. 比如 文件夹A下面的视频去掉片尾10秒 文件夹B下面的视频去掉片头6秒 ...

  4. 怎么用Camtasia给视频添加片头片尾

    有许多朋友现在喜欢自己拍摄一些小视频,现在不管是在抖音还是在B站,我们看到的大部分视频都有UP主自己制作的片头或片尾.片头做的好,甚至会有人因为片头而关注UP主,能吸引更多的人来观看视频. 所以,如果 ...

  5. VC6_预编译头

    1.去掉 使用预编译头"stdafx.h" VC6 --> Project --> Settings.. --> C/C++选项卡 --> "Ca ...

  6. 简单几步就能把素材变成大片?老司机推荐Vegas

    "素材编辑"一般分为两种,一种是对时间线素材长度和位置的编辑,另一种就是遮罩法操作. 第一种,裁剪素材(将素材在我们选定的位置一分为二),对时间线上的素材进行裁剪,有两种方法: 一 ...

  7. (十三)Packet socket 和 sockaddr_ll

    描述        本文简单描述了数据链路层的socket使用的两种方法正文     Linux下有两种方式接收数据链路层的数据包:    (1)原始的方法,即创建一个类型为SOCK_PACKET的s ...

  8. Android 手机卫士--阶段小结1

    本文地址:http://www.cnblogs.com/wuyudong/p/5904528.html,转载请注明源地址. 本文对之前手机卫士开发进行一个小结. 1.SplashActivity 版本 ...

  9. ckplayer.js视频播放插件

    网页中常见的功能就是播放视频,下面介绍的这个ckplayer.js既可以在pc端播放,也可以在手机网页上播放. 可调用flash也可以调用html5播放器: <div id="a1&q ...

随机推荐

  1. JS 求一组数中所有数的和以及平均值

    var arr = [10,20,30]; //计数器思想 var sum = 0; for(var i=0;i<arr.length;i++){ sum += arr[i]; } consol ...

  2. Nginx 学习笔记(三)proxy_cache 缓存配置和ngx_cache_purge模块

    反向代理的缓存清理 一.proxy_cache配置 (1)如何配置和安装,都在这里了:https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Ng ...

  3. android kotlin Gradle DSL method not found: '1.2.51()'错误,be using a version of the Android Gradle plug-in that does not contain the method (e.g. 'testCompile' was added in 1.1.0).

    同步的时候遇到这个问题,从log上看是因为gradle的版本不包含kotlin 1.2.51这个method,具体原因我也不是很清楚,大概猜测是kotlin版本的问题,而最新的版本就是1.2.51,所 ...

  4. Keil软仿真STM32

    当使用Keil软仿真STM32时,SystemClock设置为72MHz,使用循环延迟1s钟,实际时间明显大于1S钟,但是Keil调试窗口显示的确实是1s钟//毫秒级的延时void delay_ms( ...

  5. Postfix - Extmail 邮箱系统

    Postfix Dovecot Extmail 邮箱系统早前的内部邮箱系统重新整理下:现在Extmail官方有集成镜像的EMOS_1.6_x86_64免费版:可直接下载安装: 系统环境: linux ...

  6. Ngnix + Tomcat负载均衡架构

    一.nginx Nginx (发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.  其特点是占有内 ...

  7. Mask RCNN 简单使用

    涉及到的知识点补充: FasterRCNN:https://www.cnblogs.com/wangyong/p/8513563.html RoIPooling.RoIAlign:https://ww ...

  8. 2017/05/02 java 基础 随笔

    1.PrtSc键是截屏键   打开画图软件  ctrl+v就可以复制到 2.win7以上可以  在当前目录下shift+右键 3.junit和javaweb应用的main函数在哪里? java程序跑起 ...

  9. LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇

    题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...

  10. RNN(2) ------ “《A Critical Review of Recurrent Neural Networks for Sequence Learning》RNN综述性论文讲解”(转载)

    原文链接:http://blog.csdn.net/xizero00/article/details/51225065 一.论文所解决的问题 现有的关于RNN这一类网络的综述太少了,并且论文之间的符号 ...