位置: IT常识 - 正文

使用ffmpeg把mp4与m3u8相互转换的操作(ffmpeg png to mp4)

编辑:rootadmin
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。 官方下载网站 http://www.ffmpeg.org/download.html,下载解压缩后请配置环境。 一、MP4 转 M3U8 M3U8 是 Unico ...

推荐整理分享使用ffmpeg把mp4与m3u8相互转换的操作(ffmpeg png to mp4),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:ffmpeg mp4转yuv,ffmpeg转换mkv为mp4,ffmpeg将mp4转换成mkv,ffmpeg mp4转yuv,ffmpeg mpp,ffmpeg将mp4转换成mkv,ffmpeg png to mp4,ffmpeg png to mp4,内容如对您有帮助,希望把文章链接给更多的朋友!

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。

官方下载网站http://www.ffmpeg.org/download.html,下载解压缩后请配置环境。

一、MP4 转 M3U8

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。”M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。

简单来说,m3u8是一个视频格式,就是将一个视频分成很多的小部分,这样方便视频的加载。

1、操作简单,但效率低ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 2 -hls_time 15 output.m3u8

生成的效果是:

将 input.mp4 视频文件每 15 秒生成一个 ts 文件,最后生成一个 m3u8 文件,m3u8 文件是 ts 的索引文件。

我们直接用 VLC media player 等播放软件是可以直接打开 m3u8 文件,像播放 mp4 一样。

默认的每片长度为 2 秒,m3u8 文件中默认只保存最新的 5 条片的信息,导致最后播放的时候只能播最后的一小部分(直播的时候特别注意)。-hls_time n设置每片的长度,默认值为 2,单位为秒。-hls_list_size n设置播放列表保存的最多条目,设置为 0 会保存有所片信息,默认值为5。-hls_wrap n设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0。这个选项能够避免在磁盘上存储过多的 片,而且能够限制写入磁盘的最多的片的数量。-hls_start_number n设置播放列表中 sequence number 的值为 number,默认值为 0。注意:播放列表的 sequence number 对每个 segment 来说都必须是唯一的,而且它不能和片的文件名(当使用 wrap 选项时,文件名有可能会重复使用)混淆。

更多参数请看文档:ffmpeg.org/ffmpeg.html#Video-Options

2、效率优化版,提升效率

TS 文件是一种媒体的扩展名,它是日本高清摄像机拍摄下进行的封装格式。MPEG2-TS(Transport Stream“传输流”;又称TS、TP、MPEG-TS 或 M2T)是用于音效、图像与数据的通信协定,最早应用于DVD的实时传送节目。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。

# 1.视频整体转码tsffmpeg -y -i music.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb out\music.ts# 2. ts 文件切片ffmpeg -i music.ts -c copy -map 0 -f segment -segment_list out\music.m3u8 -segment_time 10 out\15s_%3d.ts3、hls_time 切片时间不准确的问题

播放 m3u8 的 ts 切片,必须要完整的下载一个 ts 切片,才能够播放,设置hls_time 的时间间隔越短越好( 根据实际情况来 ),实际过程中设置切片时间间隔为 2 秒,调用如下指令:

ffmpeg -i test.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 2 index.m3u8

但没有按照参数输入,进行切片。

原因:

使用ffmpeg把mp4与m3u8相互转换的操作(ffmpeg png to mp4)

ts 文件的切割,还跟原文件视频的 GOP 大小有关系(也就是两个 I 帧之间的时间间隔),因为任何一个 ts 分片第一帧必须是I帧,否则无法最快播放,并且第一帧不是 I 帧,对于播放器也是没有任何的意义,直接被播放器扔掉。任何一个视频流必须在获取到第一个I帧才能成功解码出图片。虽然指定了 1 秒切割一个 ts 文件,实际上,由于原视频流可能好几秒才有一个 I 帧,所以必须等到下一个 I 帧,才会重新开始切片。

解决:

既然知道要1秒产生一个ts分片,那就必须产生切片的过程中,强制一秒中产生一个关键帧。

设置关键帧间隔,设置间隔为 2 秒的参数如下:-force_key_frames "expr:gte(t,n_forced*2)“

完整指令如:

ffmpeg -i test.mp4 -force_key_frames "expr:gte(t,n_forced*2)" -strict -2 -c:a aac -c:v libx264 -hls_time 2 -f hls index.m3u84、m3u8 格式解析

完整的 m3u8 文件有三部分:

index.m3u8,保存视频的基本信息和分段文件顺序;key,如果视频加密,保存密钥;data文件,其他都是视频的数据文件。

具体内容解析:

#EXTM3U,是文件开始#EXT-X-VERSION,标识HLS的协议版本号;#EXT-X-TARGETDURATION,表示每个视频分段最大的时长(单位秒);#EXT-X-MEDIA-SEQUENCE,表示播放列表第一个 URL 片段文件的序列号;#EXT-X-PLAYLIST-TYPE,表明流媒体类型;#EXT-X-KEY,加密方式,这里加密方式为AES-128,同时指定IV,在解密时需要;#EXTINF,表示其后 URL 指定的媒体片段时长(单位为秒)。二、播放演示

HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。

当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。

在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。

HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。

它也很容易使用内容分发网络来传输媒体流。

video.js 播放 hls 示例

https://xushanxiang.com/demo/ffmpeg/video_hls.html

hls.js 播放示例

https://xushanxiang.com/demo/ffmpeg/hls_js.html

三、m3u8(ts) 合并为 MP4远程文件ffmpeg -i “https://xushanxiang.com/demo/ffmpeg/hls265/output.m3u8” -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4本地文件1、打开cmd2、输入指令,按照文件的实际路径合并合并成ts文件copy /b F:\f\*.ts E:\f\new.ts合并成MP4文件copy /b F:\f\*.ts E:\f\new.MP4

而通过 ffmpeg 命令如下:

直接转:ffmpeg -i new.ts -c copy -map 0:v -map 0:a output.mp4

指定音频流(一般用这个):ffmpeg -i new.ts -c copy -map 0:v -map 0:a -bsf:a aac_adtstoasc output.mp4

重编码视频:ffmpeg -y -i new.ts -c:v libx264 -c:a copy -bsf:a aac_adtstoasc output.mp4

php实现代码$url = 'https://******.m3u8?Expires=1585381145&OSSAccessKeyId=******&Signature=******';$ts_content = file_get_contents($url);$ts_content = explode(',', $ts_content);$ts_file = array();foreach ($ts_content as $key => $value) {if($key == 0) continue;$value = trim($value);$ts_file[] = substr($value, 0, strpos($value, '.ts') + 3);}$url_prefix = substr($url, 0, strpos($url, '.m3u8'));$url_prefix = substr($url, 0, strrpos($url, '/') + 1);$file_content = '';foreach ($ts_file as $key => $value) {$file_content .= file_get_contents($url_prefix . $value);}file_put_contents('tmp_out.ts', $file_content);// FFMPEG_PATH 是你自己解压ffmpeg的bin路径,例如我的是F:/ffmpeg/bin/exec(FFMPEG_PATH . "ffmpeg -i tmp_out.ts tmp_out.mp4");Python实现代码 目录结构./ |-- m3u8.py |-- result |-- 文件1 |-- key |-- index.m3u8 |-- data... |-- 文件2 |-- ... import osimport sysimport timefrom Crypto.Cipher import AESdef fileList(findex):rpath = os.path.dirname(os.path.realpath(findex))name = rpath.split("\\")[-1]fi = open(findex, 'r')flag = FalseIV = Nonetl = []for line in fi.readlines():if line.startswith("#EXT-X-KEY"):# 如果存在 IV 则提取;if line.split(",")[-1].startswith("IV="):IV = line.split(",")[-1][5:]IV = bytes.fromhex(IV)if line.startswith("#EXTINF"):flag = not flagcontinueif flag:tmp = line.strip().split("/")[-1]tmp = os.path.join(rpath, tmp)tl.append(tmp)flag = not flagfi.close()fk = open(os.path.join(rpath, "key"), 'rb')key = fk.read()fk.close()return name, tl, key, IVdef aes_decode(data, key, IV):# 如果没有指定 IV 值,则直接使用 key 值if not IV:IV = keycryptor = AES.new(key, AES.MODE_CBC, IV)plain_text = cryptor.decrypt(data)return plain_textdef main():fp = os.listdir()used = [s[:-4] for s in os.listdir("./result/")]for ind in fp:if not ind.isdigit():continueif ind in used:continuetry:name, fl, key, IV = fileList(os.path.join(ind, "index.m3u8"))except:print("-"*30)print("[-] Errot! file: ", ind)print("-"*30)continueprint("[*] Begin process file: ", name
本文链接地址:https://www.jiuchutong.com/zhishi/310542.html 转载请保留说明!

上一篇:php中 __clone的使用(php clone函数)

下一篇:java变量的初始化(java中的变量)

  • 揭秘微信淘客日引流200+精准人群全过程(淘客微信公众号怎么做)

    揭秘微信淘客日引流200+精准人群全过程(淘客微信公众号怎么做)

  • 电话订火车票怎么使用(电话订火车票流程)(电话订火车票怎么查询订单)

    电话订火车票怎么使用(电话订火车票流程)(电话订火车票怎么查询订单)

  • qq音乐在哪里绑定手机号(qq音乐在哪里绑定微信)

    qq音乐在哪里绑定手机号(qq音乐在哪里绑定微信)

  • 小米手表color2支持nfc吗(小米手表Color2支持匹配苹果手机吗)

    小米手表color2支持nfc吗(小米手表Color2支持匹配苹果手机吗)

  • 微信留言板怎么做 微信留言板制作方法(微信留言板怎么看)

    微信留言板怎么做 微信留言板制作方法(微信留言板怎么看)

  • 快手小店的订单都看不了怎么回事(快手小店的订单怎么突然没有了)

    快手小店的订单都看不了怎么回事(快手小店的订单怎么突然没有了)

  • wifi用户名在哪里看(wifi用户名哪个好听)

    wifi用户名在哪里看(wifi用户名哪个好听)

  • 在word标准模板中,正文的默认中文字体为(在word标准模板中正文的默认中文字体)

    在word标准模板中,正文的默认中文字体为(在word标准模板中正文的默认中文字体)

  • 手机直播发烫怎么解决(手机直播发热严重)

    手机直播发烫怎么解决(手机直播发热严重)

  • iphonex支持无线充电吗(iphonex支持无线充电多少瓦)

    iphonex支持无线充电吗(iphonex支持无线充电多少瓦)

  • word把格式化分为哪三类(word把格式化分为什么等三类)

    word把格式化分为哪三类(word把格式化分为什么等三类)

  • 苹果手机一热就卡怎么回事(苹果手机一热就卡)

    苹果手机一热就卡怎么回事(苹果手机一热就卡)

  • 魅族17开售时间(魅族17什么时候上市)

    魅族17开售时间(魅族17什么时候上市)

  • qq通知显示消息预览什么意思

    qq通知显示消息预览什么意思

  • 电信卡显示hd什么意思(电信电话卡显示hd)

    电信卡显示hd什么意思(电信电话卡显示hd)

  • 2.4g网络什么意思啊(什么是2.4g网络)

    2.4g网络什么意思啊(什么是2.4g网络)

  • 华为服务在哪里设置(华为服务在哪里打开)

    华为服务在哪里设置(华为服务在哪里打开)

  • 手机的下载管理在哪(手机变成电脑下载)

    手机的下载管理在哪(手机变成电脑下载)

  • yalal10什么型号手机(yalal10刚出的时候多少钱)

    yalal10什么型号手机(yalal10刚出的时候多少钱)

  • 华为亲情关怀怎么没了(华为亲情关怀怎么下载)

    华为亲情关怀怎么没了(华为亲情关怀怎么下载)

  • 酷狗桌面歌词怎么设置(酷狗桌面歌词怎么解锁)

    酷狗桌面歌词怎么设置(酷狗桌面歌词怎么解锁)

  • 笔记本加内存条有用吗(笔记本加内存条需要注意什么问题)

    笔记本加内存条有用吗(笔记本加内存条需要注意什么问题)

  • qq被封永久怎么解封(qq封永久怎么解除)

    qq被封永久怎么解封(qq封永久怎么解除)

  • 小米手环4怎么使用(小米手环4怎么充电)

    小米手环4怎么使用(小米手环4怎么充电)

  • excel记录单在哪里(excel2007记录单怎么用)

    excel记录单在哪里(excel2007记录单怎么用)

  • 马蹄莲的养殖方法(马蹄莲的养殖方法和注意事项视频)

    马蹄莲的养殖方法(马蹄莲的养殖方法和注意事项视频)

  • 电脑学习网wordpress二次元动漫影视视频主题模板qinmeiV3.0安装使用傻瓜教程-电脑学习网教程(电脑学word下哪个软件视频)

    电脑学习网wordpress二次元动漫影视视频主题模板qinmeiV3.0安装使用傻瓜教程-电脑学习网教程(电脑学word下哪个软件视频)

  • phpcms如何添加模板(phpcms插件)

    phpcms如何添加模板(phpcms插件)

  • 印花税纳税义务人有哪些
  • 纳税怎么算
  • 待认证进项税账务处理
  • 财务软件怎么样才能用
  • 公户的钱能买股票怎么处理
  • 合伙企业当年盈亏怎么算
  • 企业的承兑汇票贴息很高说明什么
  • 企业的筹建期允许有多长?
  • 工资薪金需要缴纳什么税种
  • 未核定印花税
  • 小企业以前年度损益调整科目编码
  • 个人因终止投资经营而取得的股权转让收入如何计算个人所得税?
  • 车辆买的商业险有家庭包
  • 房产税实施城市
  • 计提的工资没有实际发放,是否需要调增?
  • 电商刷单手续费做什么费用?
  • 企业银行存款账户核算的内容有
  • 现金支票存根会计要签字吗
  • 库存股是实收资本吗
  • 长期待摊费用的内容和特征
  • 开通电子税务局需要什么资料
  • 售后服务对客户满意度的影响论文
  • 招标公司返回的钱怎么算
  • smss.exe是干嘛的
  • 加班工资怎么计算劳动法
  • 在当前目录下打开cmd
  • 公司入股的钱叫什么
  • 资产减值损失在哪个表
  • php变量格式说法错误的是
  • php执行mysql语句的函数
  • php修改ip地址
  • 出售无形资产计入
  • 应交增值税明细科目怎么看
  • 红嘴牛文鸟图片
  • web应用程序的主要组成部分
  • 个人所得税零报税怎么报
  • 微信小程序基于什么框架
  • dpkg-configure-a
  • 餐饮企业原材料成本如何分析
  • 转账错误被退款怎么处理
  • 公司记账可以不开发票吗
  • 运费发票有普票吗
  • 保证增信行通俗理解
  • 个体户的税收政策
  • 递延所得税资产和负债怎么计算
  • 公户直接转给私人账户违法么
  • 中标的工程交易怎么处理
  • 什么情况纳税
  • 利润敏感性分析法可以帮助企业有哪些决策?
  • 主营业务利润的会计分录
  • 管理费用和销售费用属于什么科目
  • 社保费申报是当月的
  • 培训公司会计账务处理
  • 印花税交多了
  • 营业外支出可以抵扣进项税吗
  • 生产企业消防设施管理规定
  • 企业出现有利润的现象
  • 新准则会计科目解释
  • 建立备查账簿登记的有哪些
  • 如何远程连接小米摄像头
  • windows8命令提示符命令大全
  • win2000 xp
  • Xp系统的桌面文件在哪里
  • unins000.exe - unins000是什么意思
  • winole.exe - winole是什么进程
  • smss.exe是干嘛的
  • win7断电后无法正常启动
  • linux kinit
  • unity3d怎么编程
  • 列举linux常用的几个命令
  • bat批处理命令运行程序
  • unity一运行就停止工作
  • jquery 图片插件
  • shell脚本获取本地ip
  • dom 和bom
  • 轻松实现财富自由
  • js制作qq简易聊天框
  • 陕西省12366纳税服务热线
  • 国内货物运输代理行业代码是多少
  • 出口货物免抵税额怎么申报附加税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设