Вопрос или проблема
У меня есть локальный файл m3u8, в котором содержится интернет-ссылка, которую я загружаю с помощью ffmpeg в новый локальный файл m3u8; Пример оригинального файла m3u8:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000,RESOLUTION=640×360,
http://server.com/**123456**
У меня есть скрипт PowerShell, который проверяет внешний сайт, и когда “123456 Ключ шифрования” меняется, он переписывает m3u8 соответствующим образом с новой ссылкой http://server.com/**7777777**
Но что происходит, так это то, что пока ffmpeg загружает и заканчивает загрузку сегментов с http://server.com/**123456**, он завершает работу и не проверяет оригинальный файл m3u8 на наличие новой ссылки, чтобы продолжить загрузку сегментов потока, он просто выходит. Есть ли какой-либо способ/ключ для ffmpeg или другой программы, которую я могу использовать, чтобы, когда данные заканчиваются, она проверяла оригинальный файл на новую ссылку и так далее?
Ответ или решение
Как настроить FFmpeg для повторного чтения m3u8 файла
Использование FFmpeg для работы с m3u8 файлами может оказаться довольно сложной задачей, особенно если у вас есть необходимость в динамическом обновлении ссылок на сегменты потоков. В вашем случае, проблема заключается в том, что FFmpeg завершает своё выполнение после загрузки всех сегментов, даже если оригинальный список воспроизведения m3u8 был изменён. В этой статье мы рассмотрим, как можно настроить FFmpeg для повторной проверки оригинального m3u8 файла и перезапуска загрузки сегментов, когда происходит изменение.
Проблема
Как вы описали, ваша PowerShell скрипт проверяет внешний источник и обновляет оригинальный m3u8 файл, если изменяется ключ шифрования. Однако, когда FFmpeg завершает загрузку текущих сегментов, он не делает повторную проверку оригинального м3u8 файла для загрузки новых сегментов. Это связано с тем, что FFmpeg не поддерживает автоматическое обновление ссылки на оригинальный файл в процессе выполнения.
Решение
К сожалению, в самом FFmpeg нет встроенной функции или переключателя, который позволял бы ему автоматически перезапускаться для повторной проверки оригинального m3u8 файла. Однако вы можете использовать комбинацию внешних скриптов и самого FFmpeg для достижения вашей цели:
-
Создание циклического скрипта:
Используйте PowerShell (или bash, если вы на Linux) для создания бесконечного цикла, который будет следить за изменениями в оригинальном m3u8 файле и перезапускать FFmpeg с новым URL, как только он изменится.Пример PowerShell скрипта:
$m3u8File = "path/to/your/original.m3u8" $outputFile = "path/to/output/file.ts" while ($true) { # Проверка изменений в оригинальном m3u8 файле $newContent = Get-Content $m3u8File # Запуск FFmpeg для загрузки сегментов Start-Process -FilePath "ffmpeg.exe" -ArgumentList "-i $m3u8File -c copy $outputFile" # Ждать, пока FFmpeg завершится Wait-Process -Name ffmpeg # Проверка на изменения в контенте Start-Sleep -Seconds 10 }
-
Обработка ошибок:
Убедитесь, что ваш скрипт обрабатывает ошибки, чтобы избежать бесконечных циклов, если что-то пойдёт не так. -
Настройка интервалов проверки:
ЗадержкаStart-Sleep
может быть настроена в зависимости от ваших нужд по частоте проверки. Например, вы можете установить её на 5 или 10 секунд. -
Изучение других инструментов:
Если PowerShell не подходит, вы можете рассмотреть возможность использования других инструментов, таких какstreamlink
илиcurl
, которые могут иметь более удобные функции автоматического повторного подключения.
Заключение
Таким образом, в данной ситуации автоматизация процесса с помощью скрипта в PowerShell является наиболее целесообразным решением. Несмотря на то, что FFmpeg не имеет встроенной возможности для повторного чтения m3u8 файла, с использованием дополнительных инструментов и скриптов вы сможете добиться необходимого результата. Убедитесь, что ваш скрипт постоянно отслеживает изменения и перезапускает загрузку сегментов, что позволит вам оставаться в актуальности.