Перейти к содержимому
Калькуляторы

Транскодинг mpeg4 в mpeg2 ffmpeg

Задача: имеется головная станция аналогового ТВ с поддержкой только IP/UDP mpeg2. Источник сигнала - федеральный DVB-T2 в формате mpeg4. Нужно транскодировать на лету несколько multicast udp потоков в формате mpeg4 в mpeg2

 

В ходе изучения мануала и экспериментов вывел вот такую строку

 

ffmpeg -i "udp://234.5.100.8:1234" -vcodec mpeg2video -q:v 3 -b:a 192k -f mpegts "udp://234.5.100.231:1234?pkt_size=1316&buffer_size=65535"

 

Но на выходе получается картинка с артефактами и ГС принимает этот поток с ошибками.

 

Пробовал вместо "-q:v 3" указывать "-b:v <требуемый bitrate>" - артефакты, кроме случаев когда указываю запредельно низкий битрейт, но тогда картинка сильно теряет в качестве.

 

Подскажите, если есть у кого опыт, какие параметры надо указывать для правильного транскодинга?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

сперва проверьте как ваша станция будет реагировать на VBR поток с кривыми PCR, именно такой поток вы получите на выходе ffmpeg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А в чём их кривость?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ГС реагирует как то так: см. скриншот. Первые два потока от нормальных источников, третий и четвертый от транскодера, битрейт все время прыгает от нуля до максимума.

post-2673-067412100 1433341412_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кривыми PCR

 

Присоединяюсь к вопросу - почему PCR кривые и как с этим бороться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А в чём их кривость?

C год назад задавался аналогичной идеей (ffmpeg) - на выходе получался только VBR, c не стабильным PCR интервалом..... хотя на вход подавал нормальный поток.

Но этот поток нужно было подавать не в аналог, а в цифру - приводило к частичной пикселизации изображения и "цыканью" звука. Решили задачу на "платной" основе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Боюсь,ffmpeg'ом хрен нормально (без периодичеких артефактов) получиться (занимался похожим вопросом когда-то),(для обретения дао) читайте: Creating DVB-T compatible MPEG2 streams using FFMPEG

 

The stream actually plays quite nicely on my DVB-T receiver. The playback quality is however not as good as "real" DVB-T channels and there are occasional dropped frames and errors in both video and audio. Increasing the video bit rate variables and playing with GOP and BF, "-g 12 -bf 2", increases the quality to be quite good actually but the occasional dropouts and errors are still there. Forcing FFMPEG to use a constant GOP size with "-flags cgop -sc_threshold 1000000000" improves this even more but it is still not nearly perfect. It turns out that increasing bit rate also increases the frequency of the errors. A bit rate of around 1Mb/s has almost no errors but is of course of way to low quality. A bit rate of 3Mb/s yields good quality but too many errors. 2Mb/s is the best compromise by my observations. Worth mentioning is that VLC has no problem playing back this stream.

 

Присоединяюсь к вопросу - почему PCR кривые и как с этим бороться?

 

Можно попробовать прогнать через OpenCaster,в официальном мануале вроде был пример по коррекции PCR.

Изменено пользователем aak

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

sudo -u user vlc -vvv http://192.168.0.244:4222/udp/238.1.1.86:1234 -I dummy -d --sout '#transcode{vcodec=mp2v,vb=2048acodec=mp2a,fps=25,ab=128,channels=2,samplerate=44100}:udp{mux=ts,use-key-frames,dst=238.1.1.145:1234,sdp=sa)'

Вроде нормально работает. vb настроить. Мне нужен был небольшой - 2мб/с.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вопрос про PCR снят:

https://trac.ffmpeg.org/ticket/2748 - транскодер выдавал неравномерные по размеру пакеты UDP, в самом конце топика есть маленькая приписка "also note that to get constant packets you need "-flush_packets 0""

 

Добавление данной опции позволяет получать поток с фиксированным размером пакета 1316 байт и головная станция перестает ругаться на поток.

 

НО!! при воспроизведении в VLC данный поток по прежнему пикселит. Пытаюсь играться с такими параметрами как -q:v <1...31> или -b:v <200k...10M>

 

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

 

Второй параметр создает CBR (хотя не очень похоже). Эксперименты дают аналогичный результат - или/или

 

Где то надо еще подкручивать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ГС реагирует как то так: см. скриншот. Первые два потока от нормальных источников, третий и четвертый от транскодера, битрейт все время прыгает от нуля до максимума.

Пробовал вместо "-q:v 3" указывать "-b:v <требуемый bitrate>" - артефакты, кроме случаев когда указываю запредельно низкий битрейт, но тогда картинка сильно теряет в качестве.

 

minrate,maxrate (http://stackoverflow.com/questions/10908796/how-to-force-constant-bit-rate-using-ffmpeg) и смотрите TSReader'ом на наличие пакетов c PID == 0xff

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Впринципе ГС нормально реагирует на VBR. Дело было в рандомности размера пакета UDP. Теперь только разобраться с артефактами надо

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Впринципе ГС нормально реагирует на VBR. Дело было в рандомности размера пакета UDP. Теперь только разобраться с артефактами надо

 

udp://XXX.XXX.XXX.XXX:XXXX?pkt_size=1316

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

udp://XXX.XXX.XXX.XXX:XXXX?pkt_size=1316

 

См. первый пост. Я с этого начинал. Но одного pkt_size=1316 недостаточно, надо еще указывать -flush_packets 0

 

minrate, maxrate ничего не меняет, bitrate прыгает, артефакты сыпят....

 

ffmpeg -i "udp://234.5.100.5:1234" -vcodec mpeg2video -b:v 4M -minrate:v 4M -maxrate:v 4M -b:a 192k -flush_packets 0 -f mpegts "udp://234.5.100.230:1234?pkt_size=1316"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Почитайте статью по ссылке вверху в первом ответе - крайне познавательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Почитайте статью по ссылке вверху в первом ответе - крайне познавательно.

 

Вы имеете ввиду статью Creating DVB-T compatible MPEG2 streams using FFMPEG?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да. У меня стоит ffmpeg в цикле на проигрывание нескольких роликов (льется CBR; это когда-то был первоначальный вариант для инфоканала),но постоянно периодически проявляются артефакты (звук тянет,черный экран). Видимо,автор статьи все таки прав. (хотя еще грешу на комп - слабая машинка)

Изменено пользователем aak

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Указал параметры как у него:

 

ffmpeg -i "udp://234.5.100.5:1234" -vcodec mpeg2video -flags cgop+ilme -sc_threshold 1000000000 -b:v 2M -minrate:v 2M -maxrate:v 2M -bufsize:v 1.4M -b:a 192k -flush_packets 0 -f mpegts "udp://234.5.100.230:1234?pkt_size=1316"

 

И действительно в VLC воспроизводится более менее нормально, но битрейт низковат, да и артефакты нет-нет да и проявятся, правда очень редко. Хотелось бы конечно получше. Стоит чуть повыше поставить битрейт как количество потерь резко возрастает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну так автор статьи и пишет,что конфетка не получается с ffmpeg. Как я и писал вверху,можно прогнать через промежуточный мукс (OpenCaster) с выправлением хромых битрейта/PCR. Попробовать,правда,руки так и не добрались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

P.S. Смысл идеи,в общем таков: использовать ffmpeg только для перекодировки,битрейт и пр. пилить на муксе на выходе. С OpenCaster особо не игрался,возможно,умеет "резиновый" буфер.

Изменено пользователем aak

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Указал параметры как у него:

 

ffmpeg -i "udp://234.5.100.5:1234" -vcodec mpeg2video -flags cgop+ilme -sc_threshold 1000000000 -b:v 2M -minrate:v 2M -maxrate:v 2M -bufsize:v 1.4M -b:a 192k -flush_packets 0 -f mpegts "udp://234.5.100.230:1234?pkt_size=1316"

 

И действительно в VLC воспроизводится более менее нормально, но битрейт низковат, да и артефакты нет-нет да и проявятся, правда очень редко. Хотелось бы конечно получше. Стоит чуть повыше поставить битрейт как количество потерь резко возрастает.

даю такую команду, но получившийся поток могу принять только на этой же машине

по сети почемуто никак. по мануалам для этого вроде ffserver нужен

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

вот пример последнего ни к чему не приведшего конфига

HTTPPort 8090

HTTPBindAddress 192.168.2.104

MaxHTTPConnections 2000

MaxClients 1000

MaxBandwidth 1000

CustomLog - /ffserver.log

 

Feed feed1.ffm

File feed1.ffm

FileMaxSize 123M

 

<Stream test1.mpg>

Feed feed1.ffm

Format rtp

AudioBitRate 512

AudioChannels 1

AudioSampleRate 44100

 

VideoBitRate 43210

VideoBufferSize 40

VideoFrameRate 25

VideoSize 720x576

VideoGopSize 12

 

AudioCodec mp2

VideoCodec mpeg2video

 

VideoQMin 3

VideoQMax 31

</Stream>

ну и ffmpeg я запускал ставя на выходе udp://192.168.2.104:1234/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну и на какой из интерфейсов системы оно должно выплёвывать мультикаст?

Роутингом пропиши в системе через какой интерфейс слать мультикаст.

И RP фильтры выруби нафик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я уже поставил на выход udp://240.0.0.1:1234/ а перед этим route add 240.0.0.1 eth2

но в этот раз запустил не включая вручную ffserver

не помогло. на второй машине с одной сетевой картой (для верности) включенной в эту самую eth2 vlc пишет ошибку сразу же ...

вопрос раз - ffserver нужен ? мне нужно принять одним клиентом а не множественными.

и вопрос два - что за RP фильтры ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А вы те же самые операции пробовали сделать через vlc, а не через ffmpeg? У vlc есть параметр, задающий интервал PCR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.