Stellen Sie den PAT / PMT-Zeitraum mit ffmpeg ein

3271
elbatron

Gemäß der ffmpeg-Dokumentation wird mit -pat_period der maximalen Zeit in Sekunden zwischen PAT / PMT-Tabellen festgelegt.

Ich möchte den Wert auf 100 ms setzen, erhalte jedoch nicht den gewünschten Wert.

Der Code, den ich verwende:

-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 

Ich habe mit verschiedenen Werten experimentiert, anstatt 100 zu verwenden (was 78 ergibt), ohne 100 zu erhalten.

Könnte mich bitte jemand in die richtige Richtung weisen? Ich vermute, dass ich etwas vermisse oder die Werte nicht richtig konvertiere.

1

3 Antworten auf die Frage

1
Sherry

Ich versuche auch, die -pat_period zu ändern. Ich war bisher jedoch nicht erfolgreich. Möchte aber gerne meine Forschung teilen. Ich habe die Quelldatei von mpegtsenc.c eingecheckt. Der folgende Code erklärt, wie es funktioniert, wie unten gezeigt: Hinweis: Dies ist ein Hinweis auf den Code.

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); 

Definiere Werte wie folgt:

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

Wenn Sie die Werte berechnen, erhalten Sie den korrekten pcr-Wert gemäß dem Ausdruck. In diesem Beispiel habe ich 7-Werte für -pat_period, -sdt_period, -pcr_period und Muxrate 6500000 angegeben. Sie erhalten einen Wert für die PCR. Den Wert, den Sie für SDT oder PAT versuchen, überträgt er jedoch nach jeweils 2147483647 pkts.

Beispiel für die PCR

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

Wie Sie sehen, zeigt die Debug-Zeile von ffmpeg, dass die PCR nach jeweils 30 pkts übertragen wird. Dies ist bei SDT / PAT jedoch nicht der Fall.

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

Für PAT / SDT sollten wir einen ähnlichen Wert haben, der tatsächliche Wert ist jedoch anders als erwartet. Ich arbeite immer noch daran. Ich dachte an meine Erkenntnisse. Ich würde es begrüßen, wenn Experten helfen können.

Ich würde gerne wissen, ob Sie vorschlagen können, wie Sie 78 für PAT erreicht haben? Wie haben Sie überprüft, dass es nach 78 pkts ist?

Problemumgehung sind:

1) Sie können den gewünschten Wert im Quellcode definieren, kompilieren und so lange testen, bis Sie ein Ergebnis erhalten. 2) Erhöhen Sie die Muxrate, es sei denn, Sie erhalten das gewünschte Ergebnis, es kostet jedoch viel Bandbreitenverbrauch. Durch Erhöhen wird die Anzahl der Pakete verringert, nach denen PAT gesendet werden soll

Update: Mein schlechtes Nein, es macht keinen Unterschied zu TS. Eigentlich erhöht es sich auf PAT / PMT auf 483 ms, was einen Höchstwert von 500 ms erreicht und einen Alarm im Analysegerät erzeugt.

Vielen Dank für das Teilen Ihrer Ergebnisse. Ich verwende den MPEG-2 Transport Stream Analyzer (Win), um die tatsächlichen Vorkommen (oder besser die Entfernung zwischen 2) in einer bestimmten Datei zu berechnen. elbatron vor 8 Jahren 0
0
elbatron

Die Verwendung -mpegts_start_pid 0x15anstelle von -pat_period100 ms ergibt eine PAT / PMT-Periode.

Der Code, den ich für HD-Dateien verwendet habe, wurde von einem großen Telekommunikationsanbieter akzeptiert (die Spezifikation forderte 100 ms):

-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 

Ich hoffe es hilft anderen.

0
Sherry

Aus Gründen der Reputation kann ich nicht kommentieren, deshalb füge ich Ihrer Antwort eine Antwort hinzu. Ich bin froh, dass Sie die Lösung gefunden haben, aber ich kann sehen, dass einige Parameter in Ihrer Befehlszeile nicht erforderlich sind. Beispielsweise benötigen Sie kein Argument '-f mpegts', wie unten hervorgehoben:

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

sollte so genug sein

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

Dieses -mpegts_start_pid 0x150 sollte keinen Unterschied machen. Ich denke, es kann sich um den PMT-PID-Wert handeln, den Sie vielleicht untersuchen möchten. Überprüfen Sie auch, ob ich meine Ergebnisse aktualisiert habe.

Du hast recht, -f mpegts ist nicht nötig. Beachten Sie, dass Bufsize, Muxrate, CBR-Bitrate für Video und Audio in meinem Fall (zusammen mit vielen anderen Aspekten) streng festgelegt sind, sodass ich nicht mit diesen spielen konnte. Die Verwendung von -pat_period machte keinen Unterschied. (Ich bekam 78 für eine 2-minütige Testdatei), während das Hinzufügen von -mpegts_start_pid 0x150 die erforderlichen 100 ms PAT / PMT ergab. elbatron vor 8 Jahren 0
@elbatron hast du die `-mpegts_flags` mit` resend_headers` oder `pat_pmt_at_frames` müde Sherry vor 8 Jahren 0
Nein. Sobald ich mit 100 oder fast 100 PAT / PMT endete, wurden meine Dateien akzeptiert und ich habe alle Filme verschlüsselt und übertragen. Ich habe mich seitdem nicht mehr mit dem Problem beschäftigt. elbatron vor 8 Jahren 0