将 MKV 转换为 HLS,并保留所有音轨和字幕

将 MKV 转换为 HLS,并保留所有音轨和字幕

过去几周,我一直在尝试转换 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');

相关内容