批量转换MP4文件为M3U8格式的脚本

1. FFmpeg命令解读

ffmpeg 
-i 1.mp4 
-vf scale=720:1280 
-c:a aac -ar 48000 
-b:a 96k 
-c:v h264 
-profile:v main 
-crf 23 -g 48 
-keyint_min 48 
-sc_threshold 0 
-b:v 1200k 
-maxrate 1300k 
-bufsize 1800k 
-hls_time 4 
-hls_playlist_type vod 
-hls_segment_filename ./m3u8/1/segment%03d.ts 
./m3u8/1/1.m3u8

这是一个FFmpeg命令,用于将视频文件转换为HLS(HTTP Live Streaming)格式。我详细解释这个命令的各个部分:

命令结构分解

基本输入输出

  • ffmpeg -i 1.mp4 - 输入文件
  • ./m3u8/1/1.m3u8 - 输出的HLS播放列表文件路径

视频处理参数

  • -vf scale=720:1280 - 视频滤镜,将视频缩放为720×1280分辨率(竖屏视频比例9:16)
  • -c:v h264 - 视频编码器设置为H.264
  • -profile:v main - H.264编码配置文件设置为"main"级别
  • -crf 23 - 恒定速率因子,控制视频质量(值越小质量越高,文件越大,23是常用值)
  • -g 48 - 关键帧间隔(GOP大小)为48帧
  • -keyint_min 48 - 最小关键帧间隔为48帧
  • -sc_threshold 0 - 禁用场景切换检测,强制使用固定的GOP结构
  • -b:v 1200k - 视频比特率设置为1200kbps
  • -maxrate 1300k - 最大视频比特率限制为1300kbps
  • -bufsize 1800k - 缓冲区大小设置为1800kbps,用于比特率控制

音频处理参数

  • -c:a aac - 音频编码器设置为AAC
  • -ar 48000 - 音频采样率设置为48kHz
  • -b:a 96k - 音频比特率设置为96kbps

HLS特定参数

  • -hls_time 4 - 每个视频片段的时长为4秒
  • -hls_playlist_type vod - HLS播放列表类型设置为VOD(Video On Demand,点播)
  • -hls_segment_filename ./m3u8/1/segment%03d.ts - 指定视频片段文件的命名格式和路径

-hls_segment_filename ./m3u8/1/segment%03d.ts 是FFmpeg命令中用于指定HLS视频片段文件命名和存储路径的参数。让我详细解释这个参数的各个部分:

参数分解

./m3u8/1/segment%03d.ts

  • ./m3u8/1/ - 这是视频片段文件的存储目录路径

  • ./ 表示从当前工作目录开始

  • m3u8/ 是m3u8文件夹

  • 1/ 是以输入文件名($i变量,此处假设为"1")命名的子目录

  • 整体路径表示:当前目录下的m3u8文件夹中的"1"子文件夹

  • segment - 这是视频片段文件名的前缀,所有片段文件都以"segment"开头

  • %03d - 这是一个格式化占位符,用于生成递增的数字序列

  • %d 表示整数

  • 03 表示数字占3位,不足时前面补零

  • 因此会生成:001, 002, 003, ... 这样的序列

  • .ts - 这是文件扩展名,表示这些是MPEG传输流文件(Transport Stream)

实际效果

当FFmpeg处理视频时,它会:

  1. ./m3u8/1/目录下创建多个.ts文件
  2. 文件名会是:segment001.ts, segment002.ts, segment003.ts, ...
  3. 每个.ts文件包含约4秒的视频内容(由-hls_time 4参数决定)

播放列表内容

生成的1.m3u8文件会包含类似这样的内容:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:4.0,
segment001.ts
#EXTINF:4.0,
segment002.ts
#EXTINF:4.0,
segment003.ts
...
#EXT-X-ENDLIST

这种结构使得视频播放器可以按顺序下载和播放这些片段,实现流媒体播放效果。

整体功能

这个命令将一个MP4视频文件转换为HLS流媒体格式,具体功能包括:

  1. 视频转换:将视频缩放为720×1280分辨率(适合移动设备竖屏播放)
  2. 编码优化:使用H.264编码,设置适合流媒体播放的参数
  3. 切片处理:将视频切分为4秒的小片段(.ts文件)
  4. 生成播放列表:创建.m3u8播放列表文件,用于顺序播放这些片段
  5. 文件组织:将输出文件按输入文件名组织到对应目录中

使用场景

这种格式特别适合:

  • 网页视频播放
  • 移动应用视频流
  • 自适应比特率流媒体
  • 视频点播服务

HLS格式允许视频根据网络状况自适应调整质量,并且支持边下载边播放,是现代网页视频播放的主流技术之一。

2. 批量转换MP4文件为M3U8格式的脚本

视频参数:

  • 竖屏720x1280
  • 文件大小控制在800K以内
#!/bin/bash

# 批量转换MP4文件为M3U8格式的脚本
# 视频参数:竖屏720x1280,文件大小控制在800K以内

for i in {2..12}
do
  echo "正在处理 $i.mp4..."
  
  # 创建目录
  mkdir -p ./m3u8/$i
  
  # 检查文件是否存在
  if [ -f "$i.mp4" ]; then
    # 转换视频
    ffmpeg -i $i.mp4 -vf scale=720:1280 -c:a aac -ar 48000 -b:a 96k -c:v h264 -profile:v main -crf 23 -g 48 -keyint_min 48 -sc_threshold 0 -b:v 1200k -maxrate 1300k -bufsize 1800k -hls_time 4 -hls_playlist_type vod -hls_segment_filename ./m3u8/$i/segment%03d.ts ./m3u8/$i/$i.m3u8
    
    echo "$i.mp4 转换完成"
  else
    echo "$i.mp4 文件不存在,跳过"
  fi
done

echo "所有转换任务完成!"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容