Jump to content
Калькуляторы

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

post-2673-067412100 1433341412_thumb.png

Share this post


Link to post
Share on other sites
кривыми PCR

 

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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"

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Edited by aak

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Edited by aak

Share this post


Link to post
Share on other sites

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

 

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/

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this