Ffmpeg kullanarak PAT / PMT dönemini ayarlayın


1

Ffmpeg belgelerine göre PAT / PMT tabloları arasındaki saniye cinsinden-pat_period maksimum süreyi ayarlar .

Değeri 100 msn olarak ayarlamak istiyorum, ancak istenen değeri alamıyorum.

Kullandığım kod:

-map 0:0 -map 0:1 -c:a ac3 -ab 384k -ar 48000 -ac 6 -async 1 -streamid 1:0x102 -streamid 0:0x101 -c:v libx264 -pat_period 100 -crf 20 -b:v 7800k -minrate 7800k -maxrate 7800k -muxrate 8250K -bufsize 700k -r 25 -force_fps -s 1920x1080 -aspect 16:9 -profile:v high422 -level 40 -partitions default -b-pyramid 1 -weightb 0 -8x8dct 0 -fast-pskip 0 -rc-lookahead 40 -x264-params force-cfr=1 -trellis 1 -me_method hex -sws_flags fast_bilinear -sc_threshold 40 -keyint_min 25  -g 50 -bf 3 -qmin 3 -qmax 51 -f mpegts  -copyts -threads 8 -f mpegts -sn

100 elde etmeden 100 (bununla sonuçlanan 78) kullanmak yerine farklı değerler denedim.

Biri lütfen beni doğru yöne işaret edebilir mi? Bir şeyi özlediğimi ya da değerleri doğru bir şekilde dönüştürmediğimi farz ediyorum.

Yanıtlar:


1

-Pat_period dosyasını da değiştirmeye çalışıyorum. Ancak şimdiye kadar başarısız oldum. Ama araştırmamı paylaşmak istiyorum. Aşağıdaki kod, mpegtsenc.c kaynak dosyasında aşağıdaki kodun nasıl çalıştığını açıkladı olarak kontrol ettim: Bu kod referansı olduğunu unutmayın.

if (ts->mux_rate > 1) {
   service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME)
               (TS_PACKET_SIZE * 8 * 1000);
   ts->sdt_packet_period      = (ts->mux_rate * SDT_RETRANS_TIME)
               (TS_PACKET_SIZE * 8 * 1000);
   ts->pat_packet_period      = (ts->mux_rate * PAT_RETRANS_TIME)
               (TS_PACKET_SIZE * 8 * 1000);

değerleri tanımlamak aşağıdaki gibidir:

#define SDT_RETRANS_TIME 500
#define PAT_RETRANS_TIME 100
#define PCR_RETRANS_TIME 20
#define TS_PACKET_SIZE 188

Eğer değerleri hesaplarsanız, ifadeye göre doğru PCR değeri elde edersiniz. Bu örnekte -pat_period, -sdt_period, -pcr_period ve muxrate 6500000 değerlerine 7 değer verdim.

PCR örneği

6500000 * 7/188 * 8 * 1000 = 45500000/1504000 = 30.25265957446809

Gördüğünüz gibi ffmpeg hata ayıklama çizgisi PCR evey 30 pkts sonra iletilir. Ancak bu, SDT / PAT için geçerli değildir.

> [mpegts @ 0x22862c0] muxrate 6500000, pcr every 30 pkts, sdt every
> 2147483647, pat/pmt every 2147483647 pkts

PAT / SDT için benzer olmalıyız ancak gerçek değer beklenenden farklı. Hala üzerinde çalışıyorum. Bulgularımı paylaşmayı düşündüm. Uzmanların yardım edebileceğini takdir ediyorum.

Ayrıca PAT için 78'e nasıl ulaştığınızı önerebilir misiniz, bilmek ister misiniz? Her 78 pkte'den sonra olduğunu nasıl doğruladın?

Geçici çözüm:

1) İstediğiniz değeri kaynak kodda tanımlayabilir, derleyebilirsiniz ve sonuç alınana kadar test etmeye devam edebilirsiniz. 2) İstediğiniz sonucu almadıkça muxratı artırın, ancak çok fazla bant genişliği tüketimine mal olur. Artan paketlerin sayısını azaltacak, ardından PAT iletilecektir

Güncelleme: Benim kötü hiçbiri TS için herhangi bir fark yaratmaz, aslında PAT / PMT süresine 5003'ün üzerine çıkarak analizörde alarm üreten 483ms'ye yükselir.


Bulgularınızı paylaştığınız için teşekkür ederiz. Belirli bir dosyadaki asıl olayları (veya 2 ile arasındaki mesafeyi) hesaplamak için MPEG-2 Transport Stream analizcisini (Win) kullanıyorum.
elbatron

1

Kullanma -mpegts_start_pid 0x15yerine -pat_period100 ms PAT / PMT süre verir.

HD dosyalar için kullandığım kod büyük bir telko tarafından kabul edildi (belirtimi 100ms istedi):

-map 0:0 -map 0:1 -c:a ac3 -ab 384k -ac 6 -ar 48000 -metadata:s:a:0 language=deu -strict -2 -streamid 1:0x102 -streamid 0:0x101 -c:v libx264 -b:v 7800k -minrate 7800k -maxrate 7800k -bufsize 700k -muxrate 8250k -r 25 -s 1920x1080 -aspect 16:9 -profile:v high -level 4.0 -pix_fmt yuv420p -x264-params force-cfr=1 -trellis 1 -me_method hex -flags +cgop -sws_flags fast_bilinear -sc_threshold 40 -keyint_min 25 -g 50 -bf 3 -qmin 3 -qmax 51 -f mpegts -threads 8 -f mpegts -sn -mpegts_start_pid 0x150

Umarım başkalarına yardım eder.


0

İtibar sebebiyle yorum yapamıyorum bu yüzden cevabınıza cevap olarak ekliyorum. Çözümü bulduğunuza sevindim ama komut satırınızda bazı parametrelerin gerekli olmadığını görüyorum, örneğin aşağıda vurgulandığı gibi '-f mpegts' argümanına gerek yok:

-f mpegts -threads 8 -f mpegts -sn -mpegts_start_pid 0x150

böyle olmalı

-threads 8 -sn -f mpegts -mpegts_start_pid 0x150

Bu -mpegts_start_pid 0x150 herhangi bir fark yaratmamalı. Bakmak isteyebileceğiniz PMT pid değeri olabilir sanırım. ayrıca bulgularımı güncellediğimi de kontrol et.


Haklısın, mpegts gerekli değildir. Hem video hem de ses için, bufsize, muxrate, CBR bitrate, benim durumumda kesinlikle (birçok yönüyle birlikte) belirtildiğinden, bunlarla oynayamayacağımı unutmayın. -Pat_period kullanmak bir fark yaratmadı. (2 dakikalık bir test dosyası için 78 aldım), -mpegts_start_pid 0x150 eklenirken gerekli 100ms PAT / PMT elde edildi.
elbatron

@elbatron -mpegts_flagsile resend_headersya da ile yorgun mupat_pmt_at_frames
Sherry

Hayır, aslında 100 veya 100'e yakın PAT / PMT ile bittiğinde dosyalarım kabul edildi ve tüm filmleri kodladım ve aktardım. O zamandan beri problemden rahatsız olmadım.
elbatron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.