LINUX.ORG.RU

ffmpeg 3.4 + Debian 8.11 = При записи потока (hls) вместо «Час» пишет «Хост»

 ,


0

1

Собственно вот такое недоразумение или не знаю что. Есть не очень удобный mjpeg-поток очень бюджетно использующий трафик. Из него делается для телефонного просмотра hls, заодно и архив.

ffmpeg -- -r 4.0 -rtbufsize 90000k -analyzeduration 0 -an -f mjpeg -i http://www.video.domen/Video.mjpg -c:v libx264 -an -strict -2 -crf 23 -profile:v baseline -maxrate 900k -bufsize 2835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 10 -use_localtime 1 -strftime 1 -use_localtime_mkdir 1 -hls_segment_filename '%F/video-%F-%T%z.mp4' /video.m3u8

Это работает. И каталоги «посуточные» создаются, и пишется приемлимо. То есть создаётся каталог yyy-mm-dd и в нём хранятся файлы video-yyyy-mm-dd-HH:MM:SSTZ.mp4 Но вот возникла хотелка убрать из имени сегментов плей-листа двоеточие и добавить разделение не только по суткам, но и по часам. По идее параметр hls_segment_filename должен быть таким

%F/%H/video-%F-%H-%M-%S%z.mp4

Но %H с какого-то неожиданного испуга определяется натурально как hostname Ну, вот если хост - это mycomp, то сегмент становится примерно таким

2022-01-12/mycomp/video-2022-01-12-mycomp-39-21+0600.mp4

Попробовал для проверки заменить %H на %k . %k работает (получается то, что надо, но не нужныпробелы), но из-за своего предназначения (дополнения пробелом) не годится категорически. Но работает. Я совершенно не понимаю как и почему у ffmpeg вместо «Час» выходит «хост». И во ffmpeg-е ли вообще тут проблема? Может, кто чего подскажет: в какую сторону хоть поискать.


запросто может быть баг в ffmpeg (тем более, что у тебя допотопная версия)
может, попробуй руками поставить ffmpeg из debian 9 ?
(а если не получится, то пересобрать src-пакет из debian 9)

anonymous
()

ну или у тебя где-то в стартовых скриптах повыше переопределяется переменная H

anonymous
()

Попробуй заменить одинарные кавычки на двойные.

anonymous
()

Эта строчка:

/usr/bin/ffmpeg -- -r 4.0 -rtbufsize ....

из юнита systemd. Там нет ничего такого, чтобы каким-нибудь образом по моему указанию изменяло назначения strftime(). Другое дело, что сам ffmpeg не запускается сервисом, если не сделать именно «ffmpeg –», и рекомендуемое во множестве подавление «-nostdin -loglevel quiet» почему-то приводит к облому работы сервиса. Короче, работает только с «–». Но, похоже, именно это каким-то невероятным образом изменяет назначения для strftime(). Или там (для systemd) какие-то «свойские» переменные окружения каким-то боком выходят, что именно %H не нравится - ничего не понимаю. Изменение кавычек для hls_segment_filename, переназначение локали всё так же выдаёт подстановку именно имени хоста вместо часа. Пока откостылял этот запуск ffmpeg в баш - перенёс эту строку в скрипт, где только эта строка запуска ffmpeg, а в юните вызов этого «скрипта». Вот тут %H объявляется именно часом, как и ожидалось. Правда, для баша пришлось заменить «подавление вывода» именно на рекомендованные «-nostdin -loglevel quiet». Совершенно не понимаю конструкцию «ffmpeg –» для юнита systemd Ранее выдумал себе, что оно просто и тупо «душит» выхлопы ffmpeg. Ну и работало себе спокойно. Но вот понадобился «час» из strftime() и тут началось…

LaLe
() автор топика
Последнее исправление: LaLe (всего исправлений: 1)
Ответ на: комментарий от LaLe

Пока так и получается, что из юнита - «хост», а из баша - «час». Недостаток запуска ffmpeg из скрипта понятен. Теперь два процесса - сам баш, да ffmpeg. Завершится ли «родитель» (баш) при всех вариантах затыка «потомка» (ffmpeg) - покажет только длительное наблюдение. Если не всегда завершится, то конструкция ни к чёрту. Это будет не сервис, а равно скриптец запущенный в screen-е, за которым надо постоянно наблюдать «не заткнулся ли он». Может быть, кто-нибудь видел или знаком; что такого может подменить ожидаемый «час» (%H) на имя хоста в параметре ffmpeg (hls_segment_filename), если этот ffmpeg запущен сервисом с помощью systemd?

LaLe
() автор топика
Ответ на: комментарий от LaLe

Теперь два процесса - сам баш, да ffmpeg

В скрипте напиши exec ffmpeg ..., тогда будет один.

Завершится ли «родитель» (баш) при всех вариантах затыка «потомка» (ffmpeg)

Даже без exec, если завершится ffmpeg, то завершится и баш.

Может быть, кто-нибудь видел или знаком; что такого может подменить ожидаемый «час» (%H) на имя хоста

Посмотри ещё на синтаксис юнитов systemd, скорее всего что-то с этим связано. Спроси у Ивана @intelfx (просто напиши «собака»+ник: @intelfx, чтобы к нему обратиться), он в systemd лучше всех на форуме разбирается.

И в теги добавь systemd, может кого-то знающего заинтересует.

anonymous
()
Ответ на: комментарий от anonymous

Не знаю. У меня тоже бывает, что тупняк находит. Иногда на калькуляторе начинаю умножать на 1. Да и в конце концов, будь все люди идеальными, не было таких прекрасных топиков как этот. И systemd, возможно, тоже бы не было ;)

anonymous
()
Ответ на: комментарий от anonymous

Не знаю, почему он не мог погуглить или сразу написать что запускает через systemd

Усердно гуглил и усердно читал документацию по ffmpeg. Но сомневался, что это происходит из-за ffmpeg. Ну, откуда бы я ещё этот ffmpeg для подробно изложенной цели мог бы запустить? И так много букв в объяснении что делалось и куда. Про эти «specifiers» только смутно догадывался, но не знал. Поэтому тут и спросил. Но всё же любопытно: а откуда ещё можно запустить эдакий ретранслятор в этом Debian 8.11, чтоб он работал именно сервисом, как и другие всякие sshd, nginx и прочие vsftpd. Тут они почему-то все из этих юнитов запускаются. Это неправильно что ли?

Спасибо за помощь и подсказку!

LaLe
() автор топика
Ответ на: комментарий от LaLe

откуда ещё можно запустить

Да хоть откуда. Из консоли, из скрипта, из другой программы. Но чтобы именно работал сервисом systemd, то только из systemd-шного init-a. И, с точки зрения systemd, это будет правильно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.