LINUX.ORG.RU

ffmpeg: ну очень неровный битрейт

 , , ,


0

2

Привет тебе, несокрушимый all!

Я тут опять с дурным вопросом. Наверное, блуждаю в трёх соснах... В общем, есть простейшая задача. Надо взять файл и завещать его мультикастом в кольце.

Файл изначально был в Mp4. Я очень аккуратно транскодировал его, аж в два прохода. Вот так:

ffmpeg -hide_banner -fflags +genpts -y -i sample_file.mp4 -c:v libx264 -profile:v high -b:v 4000K -g 25 -pass 1 -an -f mpegts /dev/null
ffmpeg -i sample_file.mp4 -c:v libx264 -profile:v high -b:v 4000K -g 25 -pass 2 -c:a copy -b:a 128k -f mpegts sample_file.ts

Тем самым я очень рассчитывал добиться более-менее ровного битрейта в выходном мультикасте. Ведь ffmpeg'у при таких делах вроде как и ремукса делать не надо, надо просто взять файлик и пульнуть его в виде udp-потока.

Вот параметры файла для вещания:

Input #0, mpegts, from 'sample_file.ts':
  Duration: 00:08:14.46, start: 1.458667, bitrate: 4490 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x101](und): Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 139 kb/s

Вот как я это сделал:

ffmpeg -threads 0 -re -stream_loop -1 -i sample_file.ts -c copy -f mpegts "udp://@235.5.5.5:1234?pkt_size=1316"

И что же получилось? Плеваться хочется... Ну, ошибки типа PCR error и PCR accuracy error - это неизбежное зло. Бес с ними. PAT error и PMT error меня немного удивили. Хотя понятно, что появляются они на стыке, когда ffmpeg заканчивает вещание файла и приступает к его чтению заново. Но неужто там никакой буферизации нет? Или её, буферизацию, надо как-то задавать заранее?

Но вот битрейт... Взгляните сами. Исходный файл, как показано выше, имеет битрейт около 4,5 Mbps. А у мультикаста он скачет как сумасшедший.

https://ibb.co/j9Ebxw

В результате когда я подаю этот поток на ремультиплексор (чисто для выравнивания битрейта), то на особо резвых скачках получаю адову пачку CC error, что есть ад и ужас.

Где грабельки? Что я не предусмотрел? Как поправить дело?

Мда, не думал, что будет такое дружное молчание :((

Ок, переформулирую вопрос. Какой софт умеет качественно вещать файлы в мультикаст? Есть ли такой софт среди свободного ПО? Или придётся шкандыбать к проприетарщине?

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

Какой софт умеет качественно вещать файлы в мультикаст?

не скажу за качество

VLC для кустарного вещания. Для простой автоматизации пойдет

Red5 - один из первых открытых стрим-серверов, монстр на яве, попробуй.

Не знаю, в каком состоянии сейчас erlyvideo\flussonic, есть ли открытые версии, можешь погуглить

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

Спасибо за первый отклик.

Я тем временем пытался разобраться, что происходит с ffmpeg. Заметил следующую странность. Вещаю файл в мультикаст и в реалтайме наблюдаю за тем битрейтом, который пишет сам ffmpeg. Битрейт более-менее ровный, разброс обычно в 200-400 kbps. Параллельно «слушаю» этот поток анализатором (в качестве такового приходится использовать Elecard Stream Inspector, виндовый, ничего другого под рукой нет, о свободном ПО в этой сфере мне ничего не известно). И в этой софтине я вижу, как дико скачет битрейт.

Притом не верить этой софтине, к сожалению, нельзя. Во многих случаях она подтверждала, что не врёт. Когда тестируем поток с ремультиплексора, когда ловим CC errors при скачках битрейта и т.д. и т.п.

Я подумал, что, может, где-то какая-то колбасня на сети и из-за этого изначально ровный поток где-то бьётся. Поэтому решил запустить вещание файла на той же машине, на которой установлен Elecard Stream Inspector.

Запустил... Получившийся скриншот прилагаю:

http://ibb.co/njzrHG

ffmpeg в консоли пишет более-менее ровный битрейт, а анализатор мерит этот самый поток, который ffmpeg делает... Сами видите, что он показывает.

Как это объяснить?

Abyrvalg
() автор топика

вероятно нужно использовать maxrate и bufsize для управления битрейтом на малых интервалах

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