ffmpeg: ну очень неровный битрейт
Привет тебе, несокрушимый 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. А у мультикаста он скачет как сумасшедший.
В результате когда я подаю этот поток на ремультиплексор (чисто для выравнивания битрейта), то на особо резвых скачках получаю адову пачку CC error, что есть ад и ужас.
Где грабельки? Что я не предусмотрел? Как поправить дело?