LINUX.ORG.RU

ffmpeg. Icy metadata.

 


0

1

Есть проблема в задаче вытащить из радио-потока тэг StreamTitle Icy метаданных для одновременной вставки текста этого тэга в фильтр drawtext. Радиопоток ретранслируется на экран тв и сопровождается видео картинкой(ми). *Проблем вставить текст нет, только вытащить.

попробуй вот такой text:

text='%{metadata\:StreamTitle\:default_value}'

то есть ffmpeg может в отрисовку меты, но я не проверял. возможно StreamTitle как-то иначе называется. если скинешь ссылку на поток, то потестчу. возможно тебе ещё понадобится параметр reload в drawtext.

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

Вот такой возьми http://online.truecolorsradio.ru:8007/pelman reload в drawtext'е обязательно, я в курсе. *Главное его выдернуть и положить на карту как текст-файл. Как я представляю, выдёргиваться он должен периодически с небольшим интервалом, поскольку тэги Композиция/Исполнитель этого заголовка StreamTitle меняются.

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

с %{metadata} для drawtext ничего не вышло. это какая-то покадровая мета, куда пишут другие фильтры, тегов потока там нет.

ничего лучше не придумал, чем в отдельном процессе периодически выдёргивать тег, а в другом воспроизводить поток и рисовать текст из файла. на мой взгляд — это ужасно ущербный костыль и, возможно, стоит поискать какие-нибудь другие инструменты или используя те же libav* написать что-то своё. а то получается, что мы имеем лишние подключения к серверу и лишний файл, в то время, как вся эта инфа доступна в оригинальном потоке. бред, короче.

выдернуть тег в файл можно так

$ ffprobe http://online.truecolorsradio.ru:8007/pelman -show_entries format_tags=StreamTitle -of csv=nk=1:p=0 > meta.txt &> /dev/null
$ cat meta.txt 
a-ha - The Sun Always Shines On T.V.

либо парсингом формата ffmetadata

$ ffmpeg -i http://online.truecolorsradio.ru:8007/pelman -f ffmetadata meta.txt -y &> /dev/null 
$ cat meta.txt | sed -nr 's/StreamTitle=//p'  
Richard Sanderson - Reality

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

Во-первых -f ffmetadata выдергивает всю Icy мету и пишет её только если остановить поток, это никуда не годится. Имя исполнителя/Название композиции меняется от композиции к композиции. Прочесть всю Icy мету можно без труда, записав кусок как конечный файл МедиаИнфой, либо, не включая поток, прочесть самим ffmpeg'ом. Хитрость и состоит, что из текущего потока надо тянуть эти тэги с периодической перезаписью в текстовой файл. А он в свою очередь, будучи вставленным в drawtext и выведенным на экран либо стоячим, либо бегущей строкой, будет также обновляться командой reload 1. Решение точно есть, но я не программист, поэтому не в силах.

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

Если зарядить в ком строку только -i http://online.truecolorsradio.ru:8007/pelman и запустить ffmpeg, то через две секунды появится короткий текст лога в котором также будут находится целиком Icy metadata потока с текущим Именем исполнителя/Названия композиции, а сам ffmpeg будет находится в 'Стоп'е. Если снова, скажем через 3-4 мин нажать 'Пуск'(Run), снова появится лог с Icy metadata, но уже с изменёнными в StreamTitle Именем исполнителя/Названием композиции. Предположения: 1. Еесли в таком виде заставить ffmpeg запускаться с периодичностью в 2-3сек, будет происходить обновление Icy metadata. 2. Может быть, исходя из предположения 1, можно заставить ffmpeg с интервалом в 2-3сек читать metadata потока в 'бегущем' состоянии?

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

вот таким образом передаётся мета в потоке http://www.smackfu.com/stuff/programming/shoutcast.html несложно написать свой парсер, который будет вырезать мету и сохранять название трека в файл и отдавать остальной поток, например, тому же ffmpeg-у.

если надо, то на питоне сделаю тебе.

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

Конечно же надо! И в параллельной моей теме с proxy тоже. Но задача то чтобы и то и другое работало из одной и той же libffmpeg.so Реально? Если да, то можно будет перейти на почту и там обговорить и решить всё, включая 'условия'

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

может не совсем то, что ты ожидал, но текст обновляется

$ cat icymeta.py
#!/usr/bin/python3

from urllib.request import Request, urlopen
import sys

if len(sys.argv) != 3:
    print(f'Usage: {sys.argv[0]} <url> <meta.txt>', file=sys.stderr)
    exit()

url = sys.argv[1]
file_name = sys.argv[2]

r = Request(url)
r.add_header('Icy-MetaData', '1')
c = urlopen(r)
metaint = int(c.info()['icy-metaint'])

while True:
    data = c.read(metaint)
    meta_len = c.read(1)[0] * 16
    if meta_len:
        meta = c.read(meta_len).strip(b'\0').decode()
        track = meta[13:-2]
        f = open(file_name, 'w')
        f.write(track)
        f.close()
    sys.stdout.buffer.write(data)

$ chmod +x icymeta.py

$ ./icymeta.py http://online.truecolorsradio.ru:8007/pelman meta.txt \
    | ffmpeg -i pipe:0 \
        -loop 1 -i image.jpg \
        -vf drawtext=x=10:y=10:fontsize=20:fontcolor=white:textfile=meta.txt:reload=1 \
        -c:v yuv4 -c:a copy -f avi pipe:1 \
    | ffplay pipe:0
anonymous ()
Ответ на: комментарий от anonymous

Признателен тебе за труд, но дружище, я ж выше написал, я не программист, был бы им, сюда б не обращался. Куда я всю эту твою текстуру буду вбивать? Мне нужно организовать бегущюю строку с этими тэгами из ОДНОЙ СТРОКИ ffmpeg'а! Более того, у меня это уже имеется в ffmpeg'e только старой версии, благодаря стороннему программисту. Теперь же, имея последнюю версию, где я получил то, чего нет в старой, мне нужно организовать в новой то же самое с бегущей. В старой выглядит так: -icy_metadata_file путь/y.txt -i радиопоток -i фон-картинка -c:v h264 .... -lavfi ....drawtext=всё что нужно для бегущей строки:путь/y.txt -c:a copy http://локальный адрес. Отлично работает, можно задать скорость, интервал, а что он добавил в ffmpeg.so понятия не имею.

xradio ()