Jump to content

Recommended Posts

Posted

Задача: имеется головная станция аналогового ТВ с поддержкой только 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>" - артефакты, кроме случаев когда указываю запредельно низкий битрейт, но тогда картинка сильно теряет в качестве.

 

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

Posted

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

post-2673-067412100 1433341412_thumb.png

Posted

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

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

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

Posted (edited)

Боюсь,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.

Edited by aak
Posted

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мб/с.

Posted

Вопрос про 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 (хотя не очень похоже). Эксперименты дают аналогичный результат - или/или

 

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

Posted

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

Пробовал вместо "-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

Posted

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

Posted

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

 

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

Posted

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"

Posted

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

 

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

Posted (edited)

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

Edited by aak
Posted

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

 

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 воспроизводится более менее нормально, но битрейт низковат, да и артефакты нет-нет да и проявятся, правда очень редко. Хотелось бы конечно получше. Стоит чуть повыше поставить битрейт как количество потерь резко возрастает.

Posted

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

Posted (edited)

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

Edited by aak
  • 9 months later...
Posted

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

 

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/

Posted

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

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

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

Posted

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

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

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

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

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

  • 5 weeks later...
Posted

А вы те же самые операции пробовали сделать через 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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.