gstream 📺 трансляция через gemini
Не так давно я выложил в своей капсуле пару видео файлов. И один из них на целых 37 мегабайт ;) Да, по современным мерках это смешной объём, но как всегда есть нюансы:
- из-за угроз БПЛА скорость мобильного интернета скачет как полоумная (я даже не могу понять с какой скоростью мой сервер отдаёт media файлы)
- ни один из известных мне gemini-браузеров не умеет показывать видео в потоковом режиме (только после загрузки файла целиком)
Если на стабильность мобильного интернета я повлиять могу довольно слабо, то вот решить вторую задачу не так уж и сложно.
Я написал небольшой python скрипт, который качает блоки по 16 килобайт через протокол gemini и отдаёт их в свой стандартный поток вывода. Скрипт не требует внешних зависимостей, только третий пайтон.
Для собственного удобства я сделал символическую ссылку gstream на файл gstream.py из репозитория проекта. Теперь, что бы посмотреть видео с молодыми лисами, мне не нужно ждать загрузки всех 37 мегабайт, на своей машине я делаю так:
Утилита ffplay (после недолгого кэширования) начинает воспроизводить видео. ffplay входит в состав пакета ffmpeg, но вы можете использовать свой любимый media проигрыватель, главное, что бы он умел читать свой стандартный поток ввода, как входной файл.
Подход вполне можно использовать и для аудио файлов, например так:
Исходный код можно найти в git-репозитории:
Web интерфейс к git репозиторию
Вопросы, предложения и тому подобное вы можете:
- слать по электронной почте: gstream@to.any-key.press
- выкладывать в виде поста в ActivityPub (Fediverse), упомянув меня: @continue@honk.any-key.press
P.S.
Честно говоря у меня осталась одна нерешённая проблема с ffplay -- я не смог заставить его нормально воспроизводить mp4-файлы через стандартный поток ввода. Gemini тут точно не причём, для воспроизведения проблемы достаточно запустить ffplay в паре с утилитой cat:
Я не смог найти правильную комбинацию аргументов командной строки, что бы ffplay в таком случае корректно воспроизводил mp4 видео. С mkv и mp3 прекрасно работает. Если кто-то знает в чём тут дело, то напишите мне, пожалуйста.
P.P.S. (добавлено 2025-07-25)
Огромное спасибо cthulhu, который разобрался с mp4 файлами и прислал мне решение:
Похоже, это связано с тем, что mp4 хранит блок метаданных необходимых для воспроизведения в конце файла.
Здесь предлагают перенести блок метаданных вперёд с помощью утилит `mp4box` (надо собирать) или `qt-faststart` (входит в состав ffmpeg):
https://superuser.com/questions/479063/ffmpeg-pipe-input-error/479064
...
I see the same error from FFmpeg when I pipe an mp4 file whose moov box is after the mdat box. Many mp4 generators produce such files because it is the most convenient when recording, but for consuming (especially when streaming and piping) it is frequently better to arrange the file so that the moov box comes before the mdat box.
Кстати (пользуясь случаем) не могу не отметить, что в капсуле cthulhu очень (очень-очень) много интересного. Крайне рекомендую её к посещению: