Введение:

HTTP Live Streaming (HLS) — это широко используемый протокол потоковой передачи, разработанный Apple для доставки видео- и аудиоконтента через Интернет. HLS работает, сегментируя медиафайлы на более мелкие фрагменты и доставляя их через файл списка воспроизведения с расширением .m3u8. В этом руководстве показано, как создать поток HLS с помощью Golang и FFmpeg, мощного инструмента обработки мультимедиа с открытым исходным кодом.

Предпосылки:

  1. Базовое понимание Голанга
  2. FFmpeg установлен в вашей системе

Установка FFmpeg на macOS:

Чтобы установить FFmpeg на macOS, мы рекомендуем использовать популярный менеджер пакетов Homebrew. Если у вас не установлен Homebrew, следуйте инструкциям на официальном сайте: https://brew.sh/

После установки Homebrew откройте терминал и выполните следующую команду:

brew install ffmpeg

Эта команда загрузит и установит FFmpeg и его зависимости.

Создание потока HLS в Golang:

Теперь, когда в вашей системе установлен FFmpeg, мы создадим простую функцию Golang для создания списка воспроизведения HLS и сегментации видеофайла с помощью FFmpeg. Вот код:

package main

import (
 "fmt"
 "log"
 "os/exec"
 "strconv"
)

func createHLS(inputFile string, outputDir string, segmentDuration int) error {
 // Create the output directory if it does not exist
 if err := os.MkdirAll(outputDir, 0755); err != nil {
  return fmt.Errorf("failed to create output directory: %v", err)
 }

 // Create the HLS playlist and segment the video using ffmpeg
 ffmpegCmd := exec.Command(
  "ffmpeg",
  "-i", inputFile,
  "-profile:v", "baseline", // baseline profile is compatible with most devices
  "-level", "3.0",
  "-start_number", "0", // start numbering segments from 0
  "-hls_time", strconv.Itoa(segmentDuration), // duration of each segment in seconds
  "-hls_list_size", "0", // keep all segments in the playlist
  "-f", "hls",
  fmt.Sprintf("%s/playlist.m3u8", outputDir),
 )

 output, err := ffmpegCmd.CombinedOutput()
 if err != nil {
  return fmt.Errorf("failed to create HLS: %v\nOutput: %s", err, string(output))
 }

 return nil
}

func main() {
 inputFile := "path/to/your/video.mp4"
 outputDir := "path/to/output/directory"
 segmentDuration := 10 // duration of each segment in seconds

 if err := createHLS(inputFile, outputDir, segmentDuration); err != nil {
  log.Fatalf("Error creating HLS: %v", err)
 }

 log.Println("HLS created successfully")
}

Эта функция createHLS принимает три аргумента: входной видеофайл, выходной каталог, в котором будут храниться сегменты HLS и список воспроизведения, и продолжительность каждого сегмента в секундах. Он использует ffmpeg для создания списка воспроизведения HLS и соответствующего сегментирования видео.

Заключение:

В этом руководстве показано, как установить FFmpeg на macOS и создать поток HLS с помощью Golang и FFmpeg. Этот пример можно расширить для обработки более сложных сценариев, таких как кодирование видео в разных форматах, добавление нескольких звуковых дорожек или включение субтитров.