Werbung und non-I-Frame-Schnitt

  • Zitat

    Original von Brougs78
    Kleiner Nachteil an der Geschichte: Du musst den Stream "aufnehmen", d.h. du musst dazu mit der Karte in den Transfermodus. Da bist du bei ähnlichen Problemem wie beim LiveBuffer.


    Hm. Ich muss mich doch 'blos' in den Video-Stream einklinken. Bei Femon geht das doch auch problemlos...?


    Ich möchte jetzt dmh nicht 'seinen' ganzen Thread verhunzen. Postet mir ggf. zum Thema I-Picture-Dekodierung im WSS-Thread weiter.

    yaVDR 0.6.2; H61M/U3S3 / G530 / 4GB / GT 520 (passiv) / Cine S2 (Rev. V5.5) + DuoFlex S2 / 120GB SSD (System; SATA>USB) + 3TB SATA 6Gb/s; LCD-TV Toshiba 42VL863G; AVR Yamaha RX-S600...


  • In den GOPs sind ja auch die PES-Container füe Audio und AC3-Audio enthalten.
    Da ein GOP in etwa meist 480ms dauert (12*(1000/25)) und der Zeitversatz
    zwischen den Zeitstempeln von Audio und Video bis zu zwei GOPs betragen kann,
    sollten meiner Meinung nach die Audio und Video Daten in diesem Bereich getrennt
    geschnitten werden. Könnte etwa so aussehen:


    Wenn Du also die PES-Container in die einzelnen ES-Streams zerlegtst, solltest
    Du den AV-Offset berücksichtigen. Denn der führt dazu, das Audio nach dem
    Video-CutIn noch zu Bildern vor dem Video-CutIn gehören und Audio nach dem
    Video-CutOut zu Bildern vor dem Video-CutOut gehören (das letzte Wort der Werbung).
    Eventuell läßt sich das bei Aufnahmen, die durch den Remuxer mit Reinhards *Repacker
    gelaufen sind, durch einfaches Sortieren nach den PTS-Zeitstempel der einzelnen
    Audio PES-Container erledigen.


      Werner

  • Ahhh, danke. Sehe das jetzt schon etwas klarer. Dabei ist dann aber nur der Versatz in dem MPEG-Strom gemeint, also sprich in Bytes. Man könnte also den Byte-Abstand zweier (nahezu) gleicher Audio- und Video-PTS berechnen. Wie gesagt, um den Ton kümmere ich mich morgen.


    Das Demultiplexing mache ich ja in der Tat schon, da avcodec_decode_video einen normalen ES-Strom erwartet und PES nicht verarbeiten kann. Nur das Multiplexing habe ich noch nicht in Betracht gezogen, daher auch die Probleme mit den Blockartefakten.


    Kann mir jemand vielleicht einen Hinweis geben, wo ich etwas über Multiplexing erfahren kann? Oder hat der vdr durch den *Repacker schon einen eigenen simplen Multiplexer, dem ich einfach einen Videostrom und einen oder mehrere Audioströme gebe und er mir einen PES-Strom ausspuckt? Die Audioströme müssten dabei so sein, dass die erste Audio-PTS mit der ersten Video-PTS übereinstimmt, right?


    Falls der vdr das nicht kann, in welchem Verhältnis müssen Audio- und Videodaten gemixt werden?


    Macht es evtl. sogar Sinn die PTS am Anfang des Videos auf 00:00:00.000 zu setzen und bei jedem Schnitt die PTS nahtlos in einanderübergehenzulassen?

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • dmh


    Wenn ich mich nicht irre macht es doch ProjectX auch so, oder? Was dabei rauskommt ist ein Schnitt ohne jeglichen Anfangsversatz.

    Hardware: FSC D1337, 1.6Ghz P4 Northwood, 512MB PC2100, 120GB Samsung SP1203, DVR-105, 2x Nova-T (alt), Eigenbau LIRC, Audigy 5.1fun


    Software: ct'vdr4 kernel 2.4.31, TOBI-vdr-1.3.41 sarge/exp, dvb-1.0.1, softdevice+div. plugins


    Gehäuse: Chieftec BE-01B-SL-B (Desktop)

  • Zitat

    Originally posted by Alien
    Wenn ich mich nicht irre macht es doch ProjectX auch so, oder? Was dabei rauskommt ist ein Schnitt ohne jeglichen Anfangsversatz.


    Denke ich auch. Soweit ich weiß wird das auch zum Brennen auf DVD benötigt, nicht aber unbedingt für die VDR-Wiedergaben. Dann müsste man nämlich nicht alle Pakete durchforsten und verändern sondern könnte nur "stupide" kopieren. :D Das ginge dann auch schneller. Und wenn man's dann doch brennen möchte, müssen eben ProjectX oder vdrsync herhalten.


    Meine Frage dazu: Hat das Rücksetzen der PTS auf 0 außer beim Brennen auf DVD noch eine Bedeutung?

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • Zitat

    Original von dmh
    Ahhh, danke. Sehe das jetzt schon etwas klarer. Dabei ist dann aber nur der Versatz in dem MPEG-Strom gemeint, also sprich in Bytes. Man könnte also den Byte-Abstand zweier (nahezu) gleicher Audio- und Video-PTS berechnen. Wie gesagt, um den Ton kümmere ich mich morgen.


    Hmmm ... ob das mit reinen Byte-Abständen machbar ist? Eventuell als temporäre
    Index-Liste ala index.vdr als temporäre Datei in /dev/shm/. D.h. eine Zuordnung
    von PTS auf den Startoffset eines AC3 oder Mpeg-Audio Frames.


    Zitat


    Das Demultiplexing mache ich ja in der Tat schon, da avcodec_decode_video einen normalen ES-Strom erwartet und PES nicht verarbeiten kann. Nur das Multiplexing habe ich noch nicht in Betracht gezogen, daher auch die Probleme mit den Blockartefakten.


    Ohne das funktioniert die firmware nicht korrekt.


    Zitat


    Kann mir jemand vielleicht einen Hinweis geben, wo ich etwas über Multiplexing erfahren kann? Oder hat der vdr durch den *Repacker schon einen eigenen simplen Multiplexer, dem ich einfach einen Videostrom und einen oder mehrere Audioströme gebe und er mir einen PES-Strom ausspuckt? Die Audioströme müssten dabei so sein, dass die erste Audio-PTS mit der ersten Video-PTS übereinstimmt, right?


    In remux.c gab es eigentlich schon immer einen remuxer, der TS nach PES und
    dann in ES + PTS auspackt und in neue PES-Frames steckt. Das nun die c*Repacker
    Klassen, jeweils ein Viedo- bzw Audio-Datenframe in genau ein PES-Container stecken,
    ist neu :D


    Zitat


    Falls der vdr das nicht kann, in welchem Verhältnis müssen Audio- und Videodaten gemixt werden?


    Solange es weit unterhalb der buffer-Grenzen von Treiber und der firmware
    liegt eigentlich beliebig.


    Zitat


    Macht es evtl. sogar Sinn die PTS am Anfang des Videos auf 00:00:00.000 zu setzen und bei jedem Schnitt die PTS nahtlos in einanderübergehenzulassen?


    Wenn die PTS-Zeiten continuierlich verlaufen, sehe ich nur Vorteile und solange
    die PTS nicht mit 33Bit max startet, ist IMHO alles im grünen Bereich.


      Werner

  • Hi,


    ich hatte auch schon den Gedanken, die PES-Pakete aus den c*Repackern in separaten Puffern abzulegen, die Puffer dann der Reihe nach abzugrasen und jeweils das Paket mit den niedrigsten PTS weiterzureichen.


    Bei den Audio-Streams sollte das nicht zu kompliziert sein, denn deren PTS sind aufsteigend.


    Beim Video-Stream existiert das Problem, dass die Frames in Dekodier-Reihenfolge erscheinen und die PTS deshalb bei den B-Frames zurückspringen. Man müsste hier also sicherstellen, dass die Audio-Daten spätestens beim Wiedergabezeitpunkt des Frames vorliegen.


    Ein Beispiel unter der Annahme, dass es für jedes Video-Paket auch ein Audio-Paket und ein Dolby-Paket gibt:


    Code
    I2   B0   B1   P5   B3   B4   P8   B6   B7   P11   B9   B10   I14   B12   B13   P17   B15
          A0   A1   A2   A3   A4   A5   A6   A7   A8    A9   A10   A11   A12   A13   A14   A15   A16   A17
           D0   D1   D2   D3   D4   D5   D6   D7   D8    D9   D10   D11   D12   D13   D14   D15   D16   D17


    Und nochmals kurz erklärt:
    In etwas zum Zeitpunkt an dem P5 beim Dekoder erscheint, wird I2 ausgegeben. Demnach sollten also spätestens hier A0 und D0 vorliegen.


    Nach dem Schnitt fände sich also folgendes in der Datei wieder:

    Code
    I2 B0 A0 D0 B1 A1 D2 P5 A2 D2 P3 A3 D3 B4 A4 D4 ...


    Da pro Video-Frame typischerweise mehr als ein PES-Paket zu 2048 Byte anfällt, sollten die Audio-Daten mitunter in das Bild eingewoben werden. Annahme: P5 besteht aus 4 PES-Paketen (a, b, c, d), dann sähe es wie folgt aus:

    Code
    P5a A2 P5b D2 P5c P5d


    Noch ein Wort zu den c*Repackern:
    Es würde wahrscheinlich Sinn machen, wenn in die PES-Pakete ohne Zeitstempel deren berechneter Zeitstempel eingetragen wird. Nachträglich kann das ohne nochmaliges Umpacken nicht erledigt werden, da die PES-Pakete auf 2048 Byte aufgefüllt sind und für die zusätzlichen 5 Bytes des Zeitstempels kein Platz mehr ist (die Pakete sollen ja 2048 Byte nicht überschreiten).


    Bye.

  • Zitat

    Original von rnissl
    ich hatte auch schon den Gedanken, die PES-Pakete aus den c*Repackern in separaten Puffern abzulegen, die Puffer dann der Reihe nach abzugrasen und jeweils das Paket mit den niedrigsten PTS weiterzureichen.


    Eventuell könnte man das mit memory mapping auf die jeweilige *.vdr
    Datei und einer Indizierung, die mittels c*Repacker-Klassen erstellt wurde,
    lösen. Die Indizierung könnte man mit mehreren offenen linked list von
    structs fertig sortiert an eine zu schreibende cMutliplex-Klasse übergeben,
    die dann die passenden ES-Daten in zu generierende PES-Container steckt.


    Zitat

    Bei den Audio-Streams sollte das nicht zu kompliziert sein, denn deren PTS sind aufsteigend.


    Beim Video-Stream existiert das Problem, dass die Frames in Dekodier-Reihenfolge erscheinen und die PTS deshalb bei den B-Frames zurückspringen. Man müsste hier also sicherstellen, dass die Audio-Daten spätestens beim Wiedergabezeitpunkt des Frames vorliegen.


    Das ist klar, denn die temporale Referenz sollte erhalten bleiben. Über so einen
    struct könnte bzw. sollte man, neben der PTS, auch Typ und ggf deren
    Eigenschaften in passenden unions berücksichtigen.


      Werner

  • Zitat

    Originally posted by bitstreamout
    Eventuell als temporäre
    Index-Liste ala index.vdr als temporäre Datei in /dev/shm/.


    Ist zwar nur nebensächlich, interessiert mich aber im Moment. Habe gegoogelt nach "/dev/shm" und dabei herausbekommen, dass es "shared memory" bedeutet und hauptsächlich für Interprozesskommunikation verwendet wird. Da können wohl zwei Prozesse Daten über einen gemeinsamen Speicherbereich austauschen.


    Warum also /dev/shm? Oder kann man den auch als sehr schnellen Speicher verstehen, wie eine Art Ramdisk?

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • Zitat

    Original von dmh


    Ist zwar nur nebensächlich, interessiert mich aber im Moment. Habe gegoogelt nach "/dev/shm" und dabei herausbekommen, dass es "shared memory" bedeutet und hauptsächlich für Interprozesskommunikation verwendet wird. Da können wohl zwei Prozesse Daten über einen gemeinsamen Speicherbereich austauschen.


    Warum also /dev/shm? Oder kann man den auch als sehr schnellen Speicher verstehen, wie eine Art Ramdisk?


    Also /dev/shm/ ist ein tmpfs, in dem Du Dateien anlegen kannst. Das geht
    schon mit `echo xxx > /dev/shm/yyy'. Die Datei ist in einer Art Ramdisk
    enthalten, und läßt sich via mmap auch in den Speicherbereich eines
    Programms abbilden. Im bitstreamout plugin verwende ich das dazu, um
    grosse und kontinuierliche Speicherbereiche zu erhalten. Das Interface dazu
    ist in shm_memory_tool.c und shm_memory_tool.h enthalten. Der Zugriff
    ist schneller als über virtuelle Speicheradressen. Wenn Du keine Ramdisk
    möchtest, wäre eventuell posix_typed_mem_open(3) eine Alternative.


    Mit mmap() erspart man sich auch das Einlesen von Dateien von der Festplatte
    in einen Speicherbereich. Nur beim Parsen der Daten sollte man sich halt
    merken, was wo genau liegt und zu welcher relativen Adresse im gemappten
    Bereich.


      Werner

  • Nach langer Fehlersuche - leider an falscher Stelle - bin ich jetzt glaube ich auf ein Problem gestoßen. Und da wollte ich mal Eure Meinungen zu hören.


    Also ich befasse mich zur Zeit mit dem Cut-In. Dabei wird eine neue GOP durch rekodieren von ein paar Bildern erzeugt. Der Einfachheit halber lasse ich mein PTS mal bei 0 starten. Die neue GOP sieht dann beispielsweise so aus:


    I0 P2 B1


    Der alte Teil so:


    I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11 I15 B13 B14 P18 B16 B17 ...


    Dann muss ich ja nun beim Zusammenfügen die zwei B-Frames mit sich überschneidenden PTS, hier: 1 und 2, vom alten Strom verwerfen. Etwa so:


    I0 P2 B1 I3 P6 B4 B5 P9 B7 B8 P12 B10 B11 I15 B13 B14 P18 B16 B17 ...


    Soweit so gut. Nur jetzt tritt folgendes Problem auf: Wir haben nun I-Frames an den Stellen 0:00:00.01, 0:00:00.04 und 0:00:00.14. Möchte man nun die GOP-Länge bestimmen, so könnte man sagen GOP2 startet beim 4. Frame und geht bis zum 14ten (exklusive), also 10 Frames. Das stimmt aber nicht, denn sieht man sich die PTS an, geht die GOP von 3 bis 15 (exklusive), also 12 Frames. Die zwei fehlenden Frames sind eben gerade die Ausgelassenen.


    Das Problem hängt mit der Präsentations- bzw. Speicherreihenfolge zusammen, die ja nicht identisch sind.


    Wie kann man damit umgehen?


    Könnten Closed Gops da ein Hinweis sein?

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

    Einmal editiert, zuletzt von dmh ()

  • Ich denke, dass die Lösung des Problems darin bestehen könnte, als dass man nun die index.vdr-Datei in Präsentierreihenfolge füllen sollte. Also für den vdr war es nicht wichtig, ob B- und P-Frames an der richtigen Stelle standen, da vdr ja nur I-Frames benutzt.


    Für einen framegenauen Schritt, muss die index.vdr-Datei nun einfach so gefüllt werden, wie die Präsentierreihenfolge ist.


    Werde das nun mal testen...


    EDIT: Leider hat sich herausgestellt, dass dieser Lösungsweg aus folgendem Grund nicht funktioniert: Die index.vdr-Datei erwartet den FileOffset in aufsteigender Reihenfolge. Diese Voraussetzung ist aber beim Speichern in Präsentierreihenfolge nicht gegeben. Die Länge eines Frames berechnet sich nämlich aus (Offset Paket n+1) - (Offset Paket n). Schade. Vielleicht kann man einfach in die index.vdr-Datei ein paar "stuffing" Pakete einfügen...

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

    Einmal editiert, zuletzt von dmh ()


  • Was hälst du davon, Deine eigene Liste zumindest für zwei, drei GOPs um
    die Schnittpunkte im Speicher zu halten? Scannen mußt Du ja sowieso, also
    warum nicht die Daten für spätere Schneiden vorhalten. Dürfte dem User
    kaum auffallen, dass da im Hintergrund vor dem bildweisen Verschieben der
    Schnittmarken ein Scanner und B/P-to-I-Frame-Transformator im Hintergrund
    läuft ... oder?


      Werner

  • Bin gerade noch am Testen, aber im Moment fehlt mir echt eine gute Idee. Also das mit der eigenen Liste wäre kein Problem, denke ich. Da ich aber die Aufnahme nachher vdr-konform haben möchte, muss ich die index.vdr-Datei erzeugen und auch benutzen.


    Ich benötige also eine Lösung, die die 2 nicht benötigten B-Frames "ordentlich" entfernt. Einfach weglassen geht nicht, wie ich jetzt weiß. Dann stimmt die Indizierung nicht mehr. Die Index-Datei würde ich auch ungerne mit irgendetwas stopfen, da dann genindex bspw. nicht mehr ordentlich laufen würde. Die Frage ist, ob man die 2 herrenlosen B-Frames irgendwie als eine Art Leerbild speichern könnte.


    Oder vielleicht geht es auch, dass man die B-Frames einfach drinläßt und nur die PTS so stark verändert, dass der Player sie einfach ignoriert. Ist aber auch nicht so eine gute Lösung. Und ob das ganze dann noch ordentlich auf eine DVD gebrannt werden kann, wage ich zu bezweifeln.


    Hat jemand eine gute Idee, wie man diese 2 B-Frames "ordentlich" loswird?

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • Ich habe da jetzt noch einmal - wie sagt man so schön - eine Nacht mit meiner Freundin drübergeschlafen :D und hab einen neuen Lösungsansatz. Weiß nur nicht, ob ich heute noch dazukomme, ihn zu testen. Stelle mir folgendes vor:


    Ich "leihe" mir einfach zwei vorhergehende B-Frames und packe sie an eine entsprechende Stelle mit PTS kleiner als die des neu generierten I-Frames. Dann sollte der VDR die auch nicht mehr spielen. Beim GOP genauen Schnitt hat man ja auch zwei B-Frames, welche nicht mehr dekodiert werden können und deren PTS kleiner ist als derjenige des ersten I-Frames. Jetzt ist natürlich die Frage, ob auch P-Frames in eine nachfolgende GOP dürfen?!?


    Also ich gehe davon aus, dass ich 3 neue Frames rekodiere und erhalte


    I0 P2 B1.


    Der alte Teil war so:


    I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11 I15 B13 B14 P18 B16 B17 ...


    Und nun nehme ich zwei B-Frames aus der alten GOP zum Beispiel


    B-3 B-4 und möchte den Stream nun so zusammenbauen:


    I0 B-3 B-4 I3 P2 B1 P6 B4 B5 P9 B7 B8 P12 B10 B11 I15 B13 B14 P18 B16 B17 ...


    Die ersten 2 B-Frames dürften keine Probleme machen, wie gesagt, macht das der VDR ja auch so beim Schnitt. Die Frage ist, ob es erlaubt ist das P2, welches nicht in die 2. GOP gehört, dort einzufügen. Habe bisher nur gesehen, dass B-Frames auch in die nachfolgende GOP dürfen.


    Jetzt sieht man aber das die I-Frames die Indizes 0:00:00.01, 0:00:00.04 und 0:00:00.16 haben. Und damit würde die Index-Datei auch wieder die korrekten Zeiten anzeigen können.


    Also noch einmal die Frage: Ist dies möglich? Kann ich ein P-Frame in die nächste GOP verschieben?


    Vielen Dank für Eure Antworten und Kommentare.


    Hoffe, ich kann das heute abend noch testen, wenn keiner dazu Rat weiß... ;)

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • Zitat

    Original von dmh
    Ich "leihe" mir einfach zwei vorhergehende B-Frames und packe sie an eine entsprechende Stelle mit PTS kleiner als die des neu generierten I-Frames. Dann sollte der VDR die auch nicht mehr spielen. Beim GOP genauen Schnitt hat man ja auch zwei B-Frames, welche nicht mehr dekodiert werden können und deren PTS kleiner ist als derjenige des ersten I-Frames. Jetzt ist natürlich die Frage, ob auch P-Frames in eine nachfolgende GOP dürfen?!?


    Wenn die GOP als geschlossen markiert wurde, sollte das funktionieren.
    Bei P-Frames dürfte das nicht funktionieren. Was spricht eigentlich
    dagegen, um die Schnittmarken herum, nur I-Frames zu verwenden?
    Wenn in einer GOP nur I-Frames auftreten hast Du die ganzen
    Probleme nicht. Wie man wegen der erhöhten Bandbreite aus I-Frames
    wieder eine IBBP-Sequenz ohne vollständige Dekodierung/Enkodierung
    macht, weis ich nicht (im Prinzip geht das). Aber eventuell ist es möglich
    einfach eine Sequenz von I-Frames um die Schnittmarken herum zu
    verwenden und auch abzuspielen. Damit fallen jedenfalls die Backward
    Referenzen der B-Frames weg.


      Werner

  • Zitat

    Originally posted by bitstreamout
    Wenn die GOP als geschlossen markiert wurde, sollte das funktionieren.
    Bei P-Frames dürfte das nicht funktionieren. Was spricht eigentlich
    dagegen, um die Schnittmarken herum, nur I-Frames zu verwenden?
    Wenn in einer GOP nur I-Frames auftreten hast Du die ganzen
    Probleme nicht.


    Also das Problem ist im Moment nicht die neuerzeugte GOP, das macht libavcodec schon ordentlich und funktioniert wohl auch. Könnte ihr (libavcodec) zwar sagen, dass nur I-Frames verwendet werden sollen, aber das brauche ich nicht, weil er eine neue abgeschlossene GOP erzeugt.


    Das Problem ist, dass der Index der einzelnen Frames mit Hilfe der index.vdr-Datei berechnet wird und bei meinem jetzigen Verfahren versagt. Und zwar werden die Indizes der I-Frames nicht mehr richtig angezeigt und GOP-Größen nicht mehr richtig berechnet.


    Dieses Problem könnte umgangen werden, wenn man die index.vdr in Präsentierreihenfolge speichert und dann müsste man aber auch die Länge eines Frames mitspeichern. In tIndex gibt's zwar noch einen short int "reserved", aber das würde eben sehr grundlegend an dem VDR zerren. Und das wollte ich eigentlich nicht. Ich wollte eben nur framegenau schneiden. Wer hätte gedacht, dass dabei solche Probleme auftauchen.


    Die index.vdr stimmt also im Prinzip nicht, funktioniert aber, da immer zwei B-Frames von der vorherigen GOP mitgenommen werden. Wenn das immer der Fall ist, klappt das auch...


    Zitat

    Originally posted by bitstreamout
    Bei P-Frames dürfte das nicht funktionieren.


    Wenn ich das richtig verstanden habe, so liest der Decoder doch eh etwas in seinen Puffer, da er sich ja an die Präsentierreihenfolge halten muss und diese Ungleich der Speicherreihenfolge ist. Ich werde das einfach mal versuchen, dort ein P-Frame in die nächste GOP zu verschieben. Sollte eigentlich funktionieren, es sei denn, der MPEG-Standard verbietet das...

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • Zitat

    Original von dmh
    Also das Problem ist im Moment nicht die neuerzeugte GOP, das macht libavcodec schon ordentlich und funktioniert wohl auch. Könnte ihr (libavcodec) zwar sagen, dass nur I-Frames verwendet werden sollen, aber das brauche ich nicht, weil er eine neue abgeschlossene GOP erzeugt.


    Kann man die libavcodec eventuell dazu veranlassen, keinen geschlossenen
    GOPs zu produzieren, d.h. ihr das Referenzbild aus dem vorherigen GOP
    zu geben, damit sie die passenden B-Frames gleich mitliefert bzw. von
    selbst includiert?


    Zitat


    Das Problem ist, dass der Index der einzelnen Frames mit Hilfe der index.vdr-Datei berechnet wird und bei meinem jetzigen Verfahren versagt. Und zwar werden die Indizes der I-Frames nicht mehr richtig angezeigt und GOP-Größen nicht mehr richtig berechnet.


    Wie wird das den bisher gelöst? Die invalid B-Frames stehen in der index.vdr und
    werden durch das abgeschlossene GOP nicht abgespielt. Im Prinzip kann da also
    statt der echten B-Frames auch ein dummy B-Frame eingesetzt und die offsets im
    index.vdr passend korrigiert werden.


      Werner

  • Zitat

    Originally posted by bitstreamout
    Kann man die libavcodec eventuell dazu veranlassen, keinen geschlossenen
    GOPs zu produzieren, d.h. ihr das Referenzbild aus dem vorherigen GOP
    zu geben, damit sie die passenden B-Frames gleich mitliefert bzw. von
    selbst includiert?


    Du hast mich da glaube ich auf eine gute Idee gebracht. Man müsste bei der neu erstellten GOP einfach noch ein paar Bilder zufügen, die er dann definitiv als B-Frames kodiert. Vielleicht am besten, das letzte Bild so oft wiederholen, bis man als letztes 2 B-Frames bekommt. (Die dürften dann auch vom Speicherplatz her nicht so groß sein, da es ja im Prinzip keine Differenz zum vorherigen Bild gibt.) Und diese müssten dann mit entsprechend veränderten PTS ihre Dienste tun. Muß mir das jetzt in einem stillen Stündchen mal überlegen wie das genau aussehen muss und ob das tatsächlich funktioniert.


    Aber jedenfalls schon mal Danke für den Tipp, ich glaube der war sehr gut... ;)

    Hardware: AMD Duron 900 MHz, 256 MB Ram, 1 x 400 GB und 2 x 200 GB Maxtor, 1 x 500 GB USB 2.0, Nec DVD-RW ND-3500AG, 1 x TT 1.6 FF DVB-S, 1 x Twinhan Budget DVB-T
    Software: VDR 1.4.1, BigPatch, DMH-DVD-Archive-Patch, Kernel 2.6.12
    ---
    "Hörma, wie heißt nomma dat Instrument mit den 3 Knöppen oben drauf...? - Ja richtig, Flöte!"

  • Hallo dmh,


    gibt es hier was neues, oder biste mit dem neuen burn-plugin beschäftigt?


    Reine Neugier.


    V_R

    VDR1: POV ION 330 mit Media-Pointer MP-S2 auf yaVDR 0.3.1 - enermay 370 Watt - 80GB SSD + 500GB HD - CoolerMaster ATX-620 - VGA2Scart + HDMI
    VDR2: Zotak ZBOX ID40 auf yaVDR unstable - Sundtek DVB-S2 + remote Sundtek - 60GB SSD - HDMI
    VDR3
    : Zotak ZBOX ID40 auf yaVDR unstable - remote Sundtek - 500GB HD - DVI
    Atom 2700 mit 13W, Ubuntu PP, 60GB SDD + 240GB SSD, 2x Sundtek DVB-S2

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!