Используете ли вы код для обработки видеофайлов или библиотеки
Что проверяют
Есть ли у вас реальный опыт с медиа и понимаете ли вы, как это делается на Go: кодеки на чистом Go никто не пишет, тяжёлую работу делает FFmpeg, а Go управляет процессом. Следом спрашивают, как вы контролировали внешний процесс: таймауты, прогресс, ошибки, параллельность.
Как отвечать
Опирайтесь на свой проект и назовите, что именно делали: транскодирование загрузок, нарезку в HLS, превью-кадры, чтение метаданных, стриминг. Каркас по технике:
- FFmpeg через
os/exec: самый частый вариант.exec.CommandContextс таймаутом, чтобы зависший процесс убивался по отмене контекста. Аргументы передаются отдельными строками,"-c", "copy", а не одной строкой"-c copy": оболочки нет, и разбивать их некому; - метаданные:
ffprobe -print_format json -show_streamsи разбор JSON в структуру вместо парсинга текста; - прогресс и потоки:
-progress pipe:1и чтение черезcmd.StdoutPipe(), вход можно подавать через stdin без временного файла; - биндинги к libav:
go-astiavчерез cgo, когда нужен покадровый доступ. Цена: cgo усложняет сборку и кросс-компиляцию; - чистый Go: Pion для WebRTC,
gortsplibдля RTSP, библиотеки разбора контейнера MP4. Кодировать видео они не умеют.
Покажите инженерную сторону. Транскодирование грузит CPU, поэтому число одновременных задач ограничивают пулом воркеров или семафором по числу ядер, а задачи берут из очереди, а не выполняют в HTTP-хендлере. Файлы от пользователей недоверенные, FFmpeg запускают в отдельном контейнере с лимитами. Результат складывают в S3-совместимое хранилище, временные файлы чистят в defer.
Если с видео вы не работали, скажите прямо и покажите, как подошли бы: FFmpeg как внешний процесс, очередь, воркеры, таймауты. Это честнее выдуманного проекта.
Где спотыкаются
Называют FFmpeg Go-библиотекой. Это программа и набор C-библиотек, в Go есть только обёртки и биндинги.
Считают, что -c copy конвертирует видео. Он только перепаковывает потоки в другой контейнер без перекодирования.
Запускают FFmpeg через sh -c со строкой из пользовательского ввода и получают инъекцию команд.