Ubuntu + ffmpeg 分片 HLS 通用。

一、先查看你的 MKV 里有几条字幕(关键)

运行这条命令,只看字幕流:

  1. ffmpeg -i "/mp4mkv/manmovie/侏罗纪世界3[中文字幕].Jurassic.World.Dominion.2022.1080p.MA.WEB-DL.DDP5.1.Atmos.H264-PandaQT.mkv" 2>&1 | grep Subtitle

你会看到类似这样的输出:

  1. Stream #0:2: Subtitle: ass (default)
  2. Stream #0:3: Subtitle: subrip
  3. Stream #0:4: Subtitle: hdmv_pgs_subtitle

记住规则:

#0:2 → 0:s:0
#0:3 → 0:s:1
#0:4 → 0:s:2

后面的数字 0、1、2 就是你要选的字幕编号!


二、直接指定某一条字幕(复制即用)

你只需要改这一个参数:

  1. -map 0:s:数字

例子 1:选第一条字幕

  1. -map 0:s:0

例子 2:选第二条字幕

  1. -map 0:s:1

例子 3:选第三条字幕

  1. -map 0:s:2

三、你最终可用的完整命令(带指定字幕)

我给你写好通用模板,你只需要改 0:s:数字 即可:

  1. ffmpeg -i "你的文件.mkv" \
  2. -map 0:v \
  3. -map 0:a \
  4. -map 0:s:1 \ <==== 这里改成你要的字幕序号 0/1/2
  5. -c:v copy \
  6. -profile:v 0 \
  7. -level 3.1 \
  8. -c:a aac -b:a 128k -ac 2 -ar 44100 \
  9. -c:s webvtt \ <==== HLS 必须转 webvtt
  10. -f hls \
  11. -hls_time 8 \
  12. -hls_list_size 0 \
  13. -hls_segment_filename "seg_%04d.ts" \
  14. "输出.m3u8"

详细说明:

  1. 分割成tls分片:
  2. -f mpegts 输出 单个 .ts 文件
  3. -f hls 自动输出 一堆 .ts 分片 + 一个 .m3u8 索引文件
  4. -bsf h264_mp4toannexb 修正视频编码格式,让手机能看到画面
  5. -pix_fmt yuv420p 报错 / 黑屏 / 有声音无画面
  6. -b:a 128k -ac 2 -ar 44100 AAC-LC 立体声,绝无声卡 / 无声问题
  7. -c:a aac 手机通用音频编码
  8. -c:v libx264 标准 H.264 编码器
  9. -profile:v baseline -level 3.1 安卓 /iOS 兼容性最好的档次
  10. -map 0:v -map 0:a -map 0:s:0强制只保留:视频 + 音频 + 第一条中文字幕
  11. Subtitle:subrip # subrip = SRT 字幕(纯文本中文字幕)

四、你的真实文件可直接运行的命令(示例)

假设你要 第二条中文字幕(0:s:1):

  1. ffmpeg -i "/mp4mkv/manmovie/侏罗纪世界3[中文字幕].Jurassic.World.Dominion.2022.1080p.MA.WEB-DL.DDP5.1.Atmos.H264-PandaQT.mkv" \
  2. -map 0:v \
  3. -map 0:a \
  4. -map 0:s:1 \
  5. -c:v copy \
  6. -profile:v 0 \
  7. -level 3.1 \
  8. -c:a aac -b:a 128k -ac 2 -ar 44100 \
  9. -c:s webvtt \
  10. -f hls \
  11. -hls_time 8 \
  12. -hls_list_size 0 \
  13. -hls_segment_filename "/mp4mkv/moviepath/emh1bHVvamlzaGlqaWUz/seg_%04d.ts" \
  14. "/mp4mkv/moviepath/emh1bHVvamlzaGlqaWUz/zhuluojishijie_three.m3u8"

用 FFmpeg 生成 DASH(MPD + 碎片化 MP4)

不转码、极速切片(推荐,CPU 极低)

  1. ffmpeg -i 你的视频.mp4 \
  2. -c copy \
  3. -f dash \
  4. -seg_duration 5 \
  5. -use_template 1 \
  6. -use_timeline 1 \
  7. -init_seg_name init-\$RepresentationID\$.m4s \
  8. -media_seg_name chunk-\$RepresentationID\$-\$Number\$.m4s \
  9. 输出文件.mpd
  10. # 示例
  11. cd d:\m3u8\mpd
  12. ffmpeg -i 1080P.mp4 -c copy -f dash -seg_duration 5 -use_template 1 -use_timeline 1 -init_seg_name init-\$RepresentationID\$.m4s -media_seg_name chunk-\$RepresentationID\$-\$Number\$.m4s alison.mpd

转码 + 切片(源为 MKV/HEVC 时)

  1. ffmpeg -i 你的视频.mkv \
  2. -c:v libx264 -crf 23 -preset fast \
  3. -c:a aac -b:a 128k \
  4. -f dash \
  5. -seg_duration 5 \
  6. -use_template 1 \
  7. 输出文件.mpd
  8. # 使用流复制的命令
  9. ffmpeg -i 1080P.mkv -c:v copy -c:a copy -f dash -seg_duration 5 -use_template 1 blison.mpd
  10. -c:v copy: 直接复制视频流,不进行重新编码。
  11. -c:a copy: 直接复制音频流,不进行重新编码。
  12. 示例: 将分辨率调整为 1280x720 (720p)
  13. ffmpeg -i 1080P.mkv -vf scale=1280:720 -c:v libx264 -crf 23 -preset fast -c:a aac -b:a 128k -f dash -seg_duration 5 -use_template 1 blison.mpd
  14. 示例: 将帧率设置为 30fps
  15. ffmpeg -i 1080P.mkv -c:v libx264 -crf 23 -preset fast -r 30 -c:a aac -b:a 128k -f dash -seg_duration 5 -use_template 1 blison.mpd
  16. # 示例
  17. ffmpeg -i 1080P.mkv -c:v libx264 -crf 23 -preset fast -c:a aac -b:a 128k -f dash -seg_duration 5 -use_template 1 blison.mpd