LINUX.ORG.RU

Сообщения Abyrvalg

 

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. А у мультикаста он скачет как сумасшедший.

https://ibb.co/j9Ebxw

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

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

 , , ,

Abyrvalg
()

ffmpeg и битый поток

Привет тебе, уважаемый All!

Есть пачка мультикаст-потоков. Собираю статистику по ним, прогоняя в цикле ffprobe. Естественно, для получения адекватной картины нужно, чтобы ffprobe отрабатывал не мешкая, без пауз и зависонов.

Как выяснилось, в ходе работы ffprobe сталкивается с тремя ситуациями.

Первая - штатная: поток есть, и он нормальный. ffprobe тратит несколько секунд на анализ, после чего выплёвывает свои данные и завершается.

Вторая - нештатная: потока внезапно нет. Чтобы ffprobe не ждал его часами, используем опцию timeout, которая присобачивается к URL, напр., отвал при таймауте 3 секунды:

ffprobe -hide_banner udp://235.5.2.50:1234?timeout=3000000

Третья - тоже нештатная: поток есть, но он не валидный. в нём вместо мультимедийных дорожек какая-то хурма. Вот тут я совсем не понял, как заставить ffprobe отваливаться, а не пытаться анализировать этот поток целую вечность. Опция timeout не срабатывает, и это выглядит логичным: поток ведь имеется! Пытался я добавить опцию типа такой:

-read_intervals 0%+#10
(мол, прочитать первые 10 пакетов и всё), но это тоже не сработало.

Есть ли какие-то варианты заставить ffprobe прекратить анализ битого поток?

 ,

Abyrvalg
()

ffmpeg: бьётся мультикаст

Здравствуй, достопочтенный All! Я сейчас, наверное, опять идиотские вопросы буду задавать... :( Есть очень простая задачка. Надо взять файл и завещать его в мультикаст (udp) с помощью ffmpeg. Только формат на MPEG2TS сменить. Казалось бы, чего проще?

ffmpeg -re -i file.mp4 -codec copy -f mpegts udp://234.2.2.70:1234

Но не тут-то было. Когда пытаюсь этот мультикаст просмотреть, вижу свинское месиво пикселей или причудливых вертикальных полос. При этом ни в какие ресурсы не упираемся, операция ведь пустяковая, проц почти не задействован. Смотрел как сдампленный multicat'ом кусок, так и сам мультикаст, проброшенный через udpxy. И multicat, и udpxy запускались на той же самой машине, т.е. мультикасту вроде некуда теряться... Но VLC-плеер при просмотре гадит в логи вот таким:

...
ts debug: skipping 32 bytes of garbage
ts warning: discontinuity received 0xf instead of 0xd (pid=256)
ts warning: lost synchro
ts debug: skipping 32 bytes of garbage
ts warning: discontinuity received 0x7 instead of 0x5 (pid=256)
ts error: libdvbpsi error (PSI decoder): TS discontinuity (received 5, expected 4) for PID 0
ts debug: PATCallBack called
ts error: libdvbpsi error (PSI decoder): TS discontinuity (received 5, expected 4) for PID 4096
ts debug: PMTCallBack called
ts warning: lost synchro
ts debug: skipping 32 bytes of garbage
ts warning: discontinuity received 0xd instead of 0xb (pid=256)
...
и таким:
...
[h264 @ 037eabc0] Reference 3 >= 3
[h264 @ 037eabc0] error while decoding MB 8 1, bytestream 28465
[h264 @ 03155ac0] top block unavailable for requested intra4x4 mode -1 at 21 0
[h264 @ 03155ac0] error while decoding MB 21 0, bytestream 28715
[h264 @ 037ea7c0] Reference 2 >= 2
[h264 @ 037ea7c0] error while decoding MB 58 1, bytestream 21391
[h264 @ 037eabc0] top block unavailable for requested intra4x4 mode -1 at 18 0
[h264 @ 037eabc0] error while decoding MB 18 0, bytestream 133199
[h264 @ 03155ac0] top block unavailable for requested intra mode at 42 0
[h264 @ 03155ac0] error while decoding MB 42 0, bytestream 97706
[h264 @ 037ea7c0] Reference 3 >= 2
...

При этом если сконвертировать файл в MPEGTS

ffmpeg -re -i file.mp4 -codec copy -f mpegts file.ts
то он прекрасно проигрывается, т.е. проблем в исходном файле нет. Но когда пытаешься завещать мультикаст из файла *.ts, то результат - тот же. Месиво.

Вот исходный файл:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'file1.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2014-10-24T15:28:57.000000Z
  Duration: 00:03:15.05, start: 0.000000, bitrate: 19783 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv), 1920x1080 [SAR 1:1 DAR 16:9], 19469 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2014-10-24T15:28:57.000000Z
      handler_name    : Alias Data Handler
      encoder         : AVC Coding
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
    Metadata:
      creation_time   : 2014-10-24T15:28:57.000000Z
      handler_name    : Alias Data Handler

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

 , ,

Abyrvalg
()

ffmpeg тормозит без видимых причин?

Ребята, наблюдаю странную ситуацию. Есть виртуальная машинка с 4 ядрами (тактовая частота 2,6 ГГц), памяти 4 Гб. На ней крутится ffmpeg 3.1.3. На входе - мультикаст, один поток. На выходе он даёт нарезку hls в четырёх битрейтах, т.е. 4 параллельно идущих hls-потока.

Тормозит он нещадно. Если на выдаче только один hls-поток - всё ок, преобразование потока идёт со скоростью 1x. Два - тоже ок. Три - тоже ок. На четырёх он начинает захлёбываться, преобразование идёт со скоростью от 0,6 до 0,9.

Так вот, удивительней всего, что и памяти хватает, и процы не загружены до конца. top / htop показывают загрузку примерно 80%. Ладно, может быть, проблемы связаны сугубо с виртуальной инфрастуктурой. Добавили на машинку пятое ядро. Запустили ffmpeg для генерации тех же четырёх потоков. Ни фига не ускорилось. Притом что суммарная загрузка процессорных ядер уменьшилась где-то до 60-65%.

Где же узкое место?

 ,

Abyrvalg
()

ffmpeg: оптимизация на виртуалке

Привет тебе, высокочтимый All!

Пробую сделать транскодирование и нарезку в hls средствами ffmpeg на виртуальной машине. Машинка имеет 4 ядра Intel Xeon E5649 (2.53GHz), 4 Гб оперативки. Хочется получить 4-битрейтное транскодирование (с нарезкой), но пока что и два битрейта машина не тянет. Вещание начинает отставать, а потом один из потоков ffmpeg (именно тот, который транскодированием занимается) падает. При этом доподлинно известно, что на другой такой же виртуалке (к которой у меня, увы, доступа нет) осуществляется полноценное транскодирование канала на 4 битрейтах и нарезка в hls. Значит, можно каким-то манером оптимизировать ffmpeg, чтобы он был в состоянии пользоваться аппаратными возможностями на виртуалке. Или я что-то фатально не так делаю... Конечно, я читал https://trac.ffmpeg.org/wiki/HWAccelIntro, но моих знаний не хватает, чтобы понять, насколько эту инфу можно применять к виртуалке. Буду признателен за любые подсказки.

 , ,

Abyrvalg
()

ffmpeg: из avi в mpegts (тупо)

Привет тебе, высокочтимый All!

Прекрасно сознаю, что проблема наверняка вызвана моим ламерством и решается вполпинка. Но... чего-то я всё-таки не догнал, а потому прошу у тебя помощи.

Задача выглядит простой. Есть авишки, их надо перегнать в MPEG-2 transport stream. То есть, никакого перекодирования не надо, только ремукс.

Вот исходный файл:

Input #0, avi, from 'fur_tv_1.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.10.2 (build 2540/release)
  Duration: 00:21:32.12, start: 0.000000, bitrate: 1980 kb/s
    Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1779 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, s16p, 192 kb/s

Сперва я поступил самым тупым образом:

ffmpeg -hide_banner -i fur_tv_1.avi fur1.ts

Открыв получившийся файл, я ужаснулся: изображение было адски «оквадрачено».

После этого я поступил умнее:

ffmpeg -hide_banner -fflags +genpts -i fur_tv_1.avi -codec copy -f mpegts fur1.ts

Получившийся файл:

Input #0, mpegts, from 'G:\Temp\fur01.ts':
  Duration: 00:21:32.16, start: 1.400000, bitrate: 2154 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: mpeg4 (Advanced Simple Profile) ([16][0][0][0] / 0x0010), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 25 fps, 25 tbr, 90k tbn, 25 tbc
    Stream #0:1[0x101]: Audio: mp3 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 192 kb/s

Открыл его. Всё чётко, никаких артефактов нет. Но при просмотре ощущение такое, что половина кадров пропущена. То есть, если в исходном файле изображение воспринималось, так сказать, непрерывно изменявшимся, то в результирующем файле оно стало чуть-чуть дёрганым. Как будто действительно кадры раз через раз пропадают. При этом fps в обоих файлах одинакова.

Пробовал я явно указать rate:

ffmpeg -hide_banner -fflags +genpts -r 25 -i fur_tv_1.avi -r 25 -codec copy -f mpegts fur1.ts
но результат был тот же.

Что я делаю не так? Наверняка где-то какую-то мелочь упустил :(

 ,

Abyrvalg
()

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

Всем приветы! Помогите, пожалуйста, в тонкостях кодирования я рублю слабо, а въезжать приходится с места в карьер...

Бьюсь над проблемой постоянного битрейта при кодировании UDP-потока в x264. Пробовал уйму всяких вариантов - всё равно битрейт скачет раза в полтора в обе стороны.

Вот один из вариантов, который я использовал:

ffmpeg -report -hide_banner \ -i «udp://@234.5.2.118:1234?fifo_size=1000000&overrun_nonfatal=1» \ -c:v libx264 -s 640x480 -aspect 4:3 -profile:v baseline -preset:v superfast -threads 0 -r 25 -b:v 2048k -minrate 2048k -maxrate 2048k -bufsize 2048k -ar 48000 -strict experimental -c:a aac -b:a 128k -f mpegts «udp://@239.13.2.99:5004?overrun_nonfatal_option=1&pkt_size=1316&fifo_size=100000000»

(настройки кодирования специально убогие, это тест)

При этом под рукой есть проприетарная железка, которая транскодирует сотню потоков и с удивительной точностью держит битрейт для каждого выходного потока. Лишнее выкидывает, недостающее добивает нулевыми фреймами или как их там...

Подозреваю, что я просто туплю и не учёл какой-то волшебный ключик... :-\

 , ,

Abyrvalg
()

ffmpeg: параметры по образцу

Привет тебе, уважаемый All!

Имею вопрос, который, может быть, покажется глупым, но не бейте новичка :)

Столкнулся с необходимостью кодировать видеофайлы с помощью ffmpeg. В диком количестве всяких ключиков и параметров мне ещё предстоит разбираться и я обязательно это сделаю. Но некоторые файлы надо кодировать, как говорится, «вчера». При этом есть видеофайл-«образец», т.е. результирующие файлы должны иметь такие же параметры (кодеки, разрешение, битрейт и т.п.) как и этот файл.

Собственно, вопрос в связи с этим. Есть ли какая-то возможность (с помощью самого ffmpeg или сторонних утилит) как-то натравить ffmpeg на файл-образец и сгенерировать весь набор его параметров и ключей, чтобы при кодировании файлов получался именно такой результат?

 ,

Abyrvalg
()

RSS подписка на новые темы