如何用FFmpeg为WMV、AVI生成m3u8及TS分片?(复用命令报错)
解决FFmpeg处理WMV/AVI生成m3u8及TS分片的问题
首先得说清楚你之前命令出错的核心原因:
- 你用的
-vbsf h264_mp4toannexb是专门给MP4里的H.264视频做格式转换的(把MP4用的AVCC格式转成TS要求的Annex B格式),但WMV和AVI里的视频编码大概率不是H.264(比如WMV常用WMV3编码,老AVI可能用MPEG-4或DivX),这个滤镜自然会报错。 -codec copy直接复制原编码的做法也有问题,因为TS容器只支持特定的编码格式(比如H.264/H.265视频、AAC/MP3音频),原文件的编码如果不在这个列表里,根本没法直接封装到TS里。
接下来给你分两种场景的解决方案:
场景1:原文件编码本身兼容TS容器
先确认一下你的WMV/AVI用的是什么编码,运行这个命令查看:
ffmpeg -i PalivalaBadraVatakam.avi
在输出里找类似这样的行:
Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 50 tbc
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s
如果视频是H.264、音频是AAC/MP3这类TS兼容的编码,那只需要去掉那个不适用的滤镜,直接复制编码即可:
ffmpeg -i PalivalaBadraVatakam.avi -codec copy -map 0 -f segment -segment_list palivaala.m3u8 -segment_time 10 palivaala%03d.ts
(注:如果还是报错,可能是AVI里的H.264是AVCC格式,可以试试把旧的-vbsf换成新版FFmpeg的写法-bsf:v h264_mp4toannexb)
场景2:原文件编码不兼容TS容器(大部分WMV和老AVI属于这种)
这种情况必须把视频转成H.264、音频转成AAC(TS最通用的兼容编码组合),命令如下:
处理AVI文件:
ffmpeg -i PalivalaBadraVatakam.avi -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -map 0 -f segment -segment_list palivaala.m3u8 -segment_time 10 palivaala%03d.ts
处理WMV文件:
ffmpeg -i input.wmv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -map 0 -f segment -segment_list output.m3u8 -segment_time 10 output%03d.ts
参数说明:
-crf 23:控制视频质量,数值越小质量越高(18-28是常用范围,23是默认)-preset medium:平衡编码速度和压缩效率,可选fast(更快)或slow(质量更好但更慢)-b:a 128k:设置音频比特率,保证音频质量
这样处理后生成的TS分片和m3u8就能正常播放了。
内容的提问来源于stack exchange,提问作者Sat
相关产品推荐
相关产品推荐

