python+ffmpeg,批量转换手机中的m3u8文件
前段时间,有朋友找我帮忙,自述其手机上使用UC浏览器,缓存的电影有近千个,手机存储不够了,想把这些电影转存到PC机上,并且将其转换为Mp4文件。小事情,安排!
一、分析情况,确定方案。
首先连接手机,将手机上的UCDownloads/VideoData文件夹中的全部文件及文件夹拷贝到电脑上,进行分析。
先看一下手机上缓存的文件格式,是很多个m3u8格式文件和一些文件夹。经查,发现这种文件并不是传统意义上的视频文件,更像是一个索引文件,就像是一本书的目录一样的东西,视频内容保存在那些文件夹中,是很多个有序号的文件。
m3u8文件可以用普通的文本编辑工具进行编辑,其中详细的标签解释,在网上有很多详细的文章,这里就不啰嗦了。在m3u8文件中,最有用的就是视频列表。如下:
从文件内容中可以很明显看出,视频片段的地址是手机上的路径,这就排除了直接使用格式工厂等软件进行转换的模式,因为文件较多,不适合手动修改路径,所以初步确定先使用python编写脚本,逐个修改文件中的路径信息,使用相对地址,即直接将原路径中的“”/storage/emulated/0/UCDownloads/VideoData//“替换掉即可。完成替换后,再使用格式工厂等软件进行格式转换。
二、批量修改文件中的路径
初步思路:1、建一个列表,存放影片文件夹中所有的m3u8文件路径。2、循环列表,打开每一个m3u8文件,逐行进行修改,并将修改后的结果保存到原文件中。(注:m3u8文件较小,可以采用这种方法,但一般情况下不建议使用,可以考虑采用中间文件或保存到新文件后,再删除旧文件的方法)
这里用到了os模块中的几条命令:一是os.listdir(),列出当前文件夹或指定文件夹下所有的文件及文件夹。二是os.path.splitext( ),分割指定路径的文件名和扩展名部分。
直接看代码吧!
import os
m3u8list=[]
#读取当前目录下所有的m3u8文件。
for fn in os.listdir():
if os.path.splitext(fn)[1]!='.m3u8':
continue
m3u8list.append(fn)
#逐个修改m3u8文件中的路径,将“/storage/emulated/0/UCDownloads/VideoData//”替换为空。
old_text1="/storage/emulated/0/UCDownloads/VideoData//"
old_text2="/storage/emulated/0/UCDownloads/VideoData/"
for mfile in m3u8list:
file_data=''
with open(mfile,"r",encoding="utf-8") as f:
for line in f:
if old_text1 in line:
line=line.replace(old_text1,'')
if old_text2 in line:
line=line.replace(old_text2,'')
file_data+=line
with open(mfile,'w',encoding="utf-8") as f:
f.write(file_data)
三、格式转换
通过上边的操作,将m3u8文件中原来的路径,全部转换为了电脑中的相对路径,使用迅雷影音等播放器已经能够播放这些视频了,但朋友要求将其转换为mp4文件,刚开始的思路是利用格式工厂等软件进行转换,省事省力,结果在使用格式工厂转换时,出现错误,提示无法转换没有扩展名的文件,感觉格式工厂类的软件应该有类似的设置,但没有耐心去找,直接转变思路,利用python调用ffmpeg程序进行格式转换。
简单说一下ffmpeg,它 是视频处理最常用的开源软件。功能强大,用途广泛,大量用于视频网站和商业软件,也是许多音频和视频格式的标准编码/解码实现。(格式工厂应该就是用的ffmpeg)
1、到https://github.com/BtbN/FFmpeg-Builds/releases下载ffmpeg程序,选择那个static 版本,这个静态库版本 里面有3个exe: ffmpeg.exe, ffplay.exe, ffprobe.exe,每个exe体积很大,因为相关的dll已经被编译到exe 里面去了。作为工具而言此版本就可以满足我们的需求。
2、下载后,直接解压缩,并将文件路径添加到系统PATH中,在命令行窗口运行
ffmpeg -version
看到此屏幕显示,表示FFmpeg就可以正常使用了。
3、使用ffmpge转换视频格式的方法
一般使用命令
ffmpeg -i inputfile.m3u8 outfile.mp4
即可完成转换,但是文件夹中视频没有扩展名,所以必须告诉它,忽略扩展名的问题,要加上参数:-allowed_extensions ALL,大致意思是允许所有的扩展名,也就同时允许了没有扩展名的情况。
另外,为了提高转换速度,还要对配置文件进行设置。要加上-preset ultrafast参数。
不多说,直接上代码:
#调用FFMPEG,逐个进行转换,参数一,忽略文件类型。参数二,转换后文件名。
#这里因为不需要返回值,只需知道是否转换成功,所以使用了subprocess模块中的call命令,来调用ffmpeg程序。
errlist=[]
for mfile in m3u8list:
subname = mfile.split('.')
output_path = subname[0] + "_new.mp4"
commcode="ffmpeg -allowed_extensions ALL -i "+mfile+' -preset ultrafast '+output_path
ret=subprocess.call(commcode,shell=True)
if ret==0:
print (mfile+'is ok')
else:
errlist.append(mfile)
print (errlist)
python+ffmpeg,批量转换手机中的m3u8文件的更多相关文章
- 使用python+ffmpeg批量转换格式
需求: 给定一个文件夹路径,遍历该文件夹内的所有文件以及子文件夹内的文件,当所有后缀名为wav格式的文件转换为ogg格式的文件. import os # 获取目录下的所有文件列表 import fn ...
- Linux批量清空当前目录中的日志文件
在Linux中,有时需要批量清空当前目录中的日志文件,同时还要保留日志文件. 其实一行shell命令就可以搞定,一起来看看吧. 在当前目录下,键入如下命令: for i in `find . -nam ...
- 【Android】14.3 浏览手机中的所有文件夹和文件
分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 前面我们了解了内部存储.外部存储的含义,用一句话说,内部存储实际上是保存在"data"文件夹下 ...
- ffmpeg 批量转换swf为mp3
下了几个音乐居然都是swf格式,在网上找了一下没找到好用的转换工具,于是想到了ffmpeg. linux下可以直接安装ffmpeg #/bin/sh for f in *.swf do ffmpeg ...
- 写一个脚本批量转换项目中GB2312编码的文件为UTF-8编码
#!/bin/bash convert_file() { for file in `find .` do if [[ -f $file ]] then if [[ ${file##*.} == lua ...
- 使用MeidaStore.Audio获得手机中的音频文件
MediaStore是安卓系统自带的多媒体系统数据库,他在每次开机时刷新一次,可以通过Cursor这个类对数据库进行访问与修改,修改之后需用广播强制刷新. 使用Cursor必须通过Context获得C ...
- python 之 查找某目录中最新的文件
记录一下这个方法,感觉很有用!>.< import os def find_newest_file(path_file): lists = os.listdir(path_file) li ...
- 【Python】批量修改指定目录下所有文件的文件名/后缀
[删除.txt文件的后缀] import os, shutil #rootdir = input("请输入文件路径(结尾加上/):") #fileList = os.listdir ...
- 【游戏开发】Excel表格批量转换成CSV的小工具
一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...
- ArcGIS 10 影像、栅格数据格式批量转换
转自原文 ArcGIS 10 影像.栅格数据格式批量转换 在做三维场景的时候,经常会涉及多种不同格式DEM数据或者影像的转换,如ASCII.GRID.IMG.TIFF等等,遇到大数据量时,我们就需要批 ...
随机推荐
- zookeeper04---ZAB协议
转https://www.jianshu.com/p/2bceacd60b8a 1.什么是Zab协议 1.1Zab协议简介 1.2 Zab 协议的特性(怎么保持数据一致性) 2.Zab 协议实现的作用 ...
- CSS特效集锦(9款 , 总有一款是你喜欢的)
主要是: 穿越时空特效, 图片放大镜, 3D相册, 立方体相册, 昼夜更替特效, 飘雪, 七彩雨, 签名生成器, 水波纹动画等 代码部分 <section> <div class=& ...
- Python实现随机森林RF并对比自变量的重要性
本文介绍在Python环境中,实现随机森林(Random Forest,RF)回归与各自变量重要性分析与排序的过程. 其中,关于基于MATLAB实现同样过程的代码与实战,大家可以点击查看MAT ...
- Centos7-RAID冗余磁盘阵列
转载csdn: Centos7-RAID冗余磁盘阵列_黏住你不让你的博客-CSDN博客
- python pip 升级失败解决方法
今天花了一上午学习python,然后现在在研究做爬虫,结果发现python提示pip需要更高的版本,然后就研究了半天,解决方法如下: 一.检查版本: pip show pip 二.更新版本: pyth ...
- 解决ssh连接远程主机出现“REMOTE HOST IDENTIFICATION HAS CHANGED”问题
Win通过ssh连接远程主机 命令提示符方式 ssh username@ip 此后输入你的密码 通过VSCode Remote-SSH 在VSCode拓展中搜索"Remote-SSH&quo ...
- The size of the request headers is too long.
当 IIS7/7.5 收到的请求头的长度超过16K(默认值),就会引发"Bad Request - Request Too Long. HTTP Error 400. The size of ...
- CSS nth-child
前言 nth-child 伪类选择器非常地好用,所以必须得掌握它,能够为我们简化不少的 CSS 代码.比如选择前 n 行元素.选择后 n 行元素.选择奇偶行元素.选择 n 倍元素等.其语法本文不说,请 ...
- 如何创建一个浏览器版的`Window11`
如何创建一个浏览器版的Window11 我们接下来将创建一个在浏览器运行的Window11,可以先看看效果图 这是基于Windows 11 in React修改的功能,我们接下来就将使用Windows ...
- linux 信号 未决信号集和屏蔽信号集
有的地方,将屏蔽又叫阻塞? 在虚拟地址空间中,内核区的PCB中 有两个64位的值(集合),分别表示64个信号的未决状态(未被处理)和屏蔽与否 kill -l 可以查看linux中的所有信号,共64个 ...