过去几周,我一直在尝试转换 MKV 和 HLS 文件。目前,我正在刻录视频中文件的第一个可用字幕轨道,并仅保留第一个音轨。
我想要做的:输入一个 MKV 文件并将其转换为 HLS,同时保留该 MKV 文件的所有音轨和所有字幕轨道。
所以,我想知道如何:输入一个 MKV 文件并将其转换为 HLS,同时保留该 MKV 文件中的所有音轨和字幕,然后将它们组合到包含视频、音频和字幕的 master.m3u8 文件中。
我已经阅读了 ffmpeg 文档,但由于我只使用了很短的时间,所以我无法做到这一点。
感谢所有能够帮助我或给我建议的人。
祝你今天过得愉快
我尝试使用 ffprobe 获取有关 MKV 的信息。
然后,我选择了音频/字幕轨道,并尝试在 python/PHP-ffmpeg 中创建一个循环,以提取 WebVTT 格式的字幕,并对音轨也进行同样的提取,然后在视频转换为 HLS 后链接整个内容。
我只收到错误,脚本根本不起作用......
答案1
我不知道您之前尝试过什么,我的理解是您需要使用 python/php-ffmpeg 将 mkv 文件转换为 hls,同时保持其原始质量、音轨和字幕。
Python(使用子进程):
import subprocess
input_file = 'path/to/your/mkv.mkv'
output_dir = 'path/to/output/directory'
command = [
'ffmpeg',
'-i', input_file,
'-c:v', 'copy', # Preserve original video quality
'-c:a', 'copy', # Preserve original audio tracks
'-c:s', 'mov_text', # Convert subtitles to WebVTT
'-hls_list_size', '0', # Create a single master playlist
'-f', 'hls',
output_dir + '/out.m3u8'
]
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# Monitor progress (example using a simple counter)
progress = 0
while True:
line = process.stdout.readline().decode('utf-8')
if not line:
break
# Extract progress information from the output (if available)
# and update your UI accordingly
progress += 1 # Or use a more sophisticated progress tracking method
print(line, end='')
process.wait()
print('HLS conversion completed!')
PHP-FFmpeg:
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('path/to/your/mkv.mkv');
$format = new FFMpeg\Format\HLS();
$format->setSegmentLength(10); # Adjust segment length as needed
$format->setListSize(0); # Create a single master playlist
$video->save($format, 'path/to/output/directory/out.m3u8');