• Hallo Jungs und Mädels,

    bitte helft mir doch mal schnell. Ich versuche gerade BCD Werte zu berechnen. playback time, BCD, hh:mm:ss:ff with bits 7&6 of frame (last) byte indicating frame rate 11 = 30 fps, 10 = illegal, 01 = 25 fps, 00 = illegal
    100 frames bei 25 fps = 00:00:04.00 = BCD : 1088
    200 frames bei 25 fps = 00:00:08.00 = BCD : 2112
    2346 frames bei 25 fps = 00:01:33.21 = BCD : 78689
    9588 frames bei 25fps = 00:06:23.13 = BCD : 402259

    Wie berechne ich es dann für 10336 Frames ? hat jemand eine einfache Formel für mich ? und villeicht sogar mit fps angabe ?

    VIELEN DANK.

  • Moin,

    hmm - muß man erstmal rausfinden, was Du uns hier anbietest...
    Angenommen, die "BCD"-Werte sind Hex, dann würde das rauskommen:

    1088 =0000.0001.0000.1000.1000
    2112 =0000.0010.0001.0001.0010
    78689=0111.1000.0110.1000.1001

    Fehlt die Übereinstimmung für das "25 fps-Bit"!

    Dezimal interpretiert:

    1088 = 0000.0000.0100.0100.0000 = 100
    2112 = 0000.0000.1000.0100.0000 = 200
    78689 =0001.0011.0011.0110.0001 = 2346
    402259=0110.0010.0011.0101.0011 = 9588

    Hier hätte man schon die Übereinstimmung in Bit 7&6 (01), wenn man von
    rechts nach links liest (letztes Oktett).

    Erzeugt man vergleichsweise das Bitmuster für Frame 2346 : 100100101010
    findet man aber auch hier keine Übereinstimmung. Ergo: Das ist sind
    gepackte Zahlen. Die zu entschlüsseln wird mir jetzt ohne Hilfsmittel
    auch zu viel...

    Gruß Karl

    Tja - der macht mir trotz nichtproportionalem Font die führenden Leerzeichen kaputt .... :hm:

  • Danke Karl für Deine Überlegungen... gepackte Zahlen, kann ich nicht glauben.
    Ja die BCD Werte Dezimal !

    Hier mal noch ne kleine Werte Tabelle:
    --- BCD --- TIME --- Frames --- FPS ---
    64 = 00:00:00.00 = 0 = 25fps
    65 = 00:00:00.01 = 1 = 25fps
    73 = 00:00:00.09 = 9 = 25fps
    74 = 00:00:00.0a ------- ERROR
    80 = 00:00:00.10 = 10 = 25fps
    96 = 00:00:00.20 = 20 = 25fps
    112 = 00:00:00.30 = 30 = 25fps
    121 = 00:00:00.39 = 39 = 25fps
    192 = 00:00:00.00 = 0 = 30fps
    233 = 00:00:00.29 = 29 = 30fps
    320 = 00:00:01.00 = 25 = 25fps
    ...
    131135 = 00:02:00.3f ------- ERROR
    131136 = 00:02:00.00 = 3000 = 25fps
    131137 = 00:02:00.01 = 3001 =25fps
    131141 = 00:02:00.05 = 3005 =25fps
    131145 = 00:02:00.09 = 3009 =25fps
    131148 = 00:02:00.1c ------- ERROR
    131152 = 00:02:00.10 = 3010 = 25fps

    noch eine Idee ???

  • Zitat von katjarella

    playback time, BCD, hh:mm:ss:ff with bits 7&6 of frame (last) byte indicating frame rate 11 = 30 fps, 10 = illegal, 01 = 25 fps, 00 = illegal
    100 frames bei 25 fps = 00:00:04.00 = BCD : 1088
    200 frames bei 25 fps = 00:00:08.00 = BCD : 2112
    2346 frames bei 25 fps = 00:01:33.21 = BCD : 78689
    9588 frames bei 25fps = 00:06:23.13 = BCD : 402259

    Wie berechne ich es dann für 10336 Frames ? hat jemand eine einfache Formel für mich ? und villeicht sogar mit fps angabe ?

    Ich kenne mich mit BCD-Werten ja eigentlich sehr gut aus, aber hier blicke ich im Moment echt nicht durch, was die Vorgabe, und was das Ziel sein solll.

    Erklärt der englische Beschreibungstext, wie die Zahlen abgelegt SIND, oder wie sie abgelegt werden SOLLEN?

    100 Frames wären 4 Sekunden bei 25fps, 25fps werden im letzten Byte als (binär) 01000000 abgelegt (laut Beschreibung), damit würde sich in BCD ergeben:

    00:00:04:40

    oder binär: 0000 0000 : 0000 0000 : 0000 0100 : 0100 0000

    :huh:

    [Edit:] Ah, ich glaube, jetzt habe ich's geblickt:

    100 frames bei 25 fps = 00:00:04:40
    200 frames bei 25 fps = 00:00:08:40
    2346 frames bei 25 fps = 00:01:33:61
    9588 frames bei 25 fps = 00:06:23:53

    und für

    10336 frames bei 25 fps = 00:06:53:51

    Kommt das hin?

    Formel:

    (n = Anzahl Frames, damit liefert n / fps die Sekunden)
    (% = MODULO, ganzzahliger Rest der Division)

    hour = (int) (n / fps) / 3600
    min = (((int) (n / fps) / 3600)) * 3600) % 60
    sec = (n / fps) % 60
    ff = (n % fps) | 0x40

    Gruß, zisoft

  • Jetzt wird das schon etwas klarer, aber immernoch nicht klar!
    Offensichtlich wird die letzte Stelle in frames, die anderen aber in
    Std:Min:Sek "verwaltet" bzw. codiert.

    ABER: Nach Deinen Angaben wäre:

    101 = 00:00:00.25 = 25 = 25fps
    Das Gleiche wie:
    320 = 00:00:01.00 = 25 = 25fps
    Das darf aber éigentlich nicht sein, daß zwei Binärwerte den gleichen
    Frame- bzw. Zeitindex bezeichnen.

    Entweder bei Deinen Angaben stimmt was nicht, oder die Methode,
    mit der Du diese Werte gewinnst, ist nicht korrekt.

    Wie dem auch sei - wenn man den Schlüssel hat, kann man einzelne Werte auch Binär ausrechnen - braucht man das mehr als ein-/zweimal, müßte man ein kleines Programm/
    script schreiben.....

    ..aber nicht mehr heute...

    Gruß Karl

  • BCD bedeutet doch, dass man die hexadezimale Darstellung eines Bytes als Mensch so lesen kann, als ob es dezimal wäre - damit kann man also Dezimalwerte von 0 bis 99 in Bytes so speichern, dass jedes Halb-Byte ("Nibble") je eine Dezimalstelle repräsentiert. Die Dezimal-Zahl 89 (Neunundachtzig) würde also hexadezimal 89h werden (das entspricht 8*16+9 = 128+9 = 137).

    Dazu käme noch mit OR-Verknüpfung das Bitmuster für die fps:

    100 frames bei 25 fps = 00:00:04.00 = BCD : 00 00 04 00 h | 00 00 00 40 h = 00 00 04 40 h
    200 frames bei 25 fps = 00:00:08.00 = BCD : 00 00 08 00 h | 00 00 00 40 h = 00 00 08 40 h
    320 frames bei 25 fps = 00:00:12.20 = BCD : 00 00 12 20 h | 00 00 00 40 h = 00 00 12 60 h
    2346 frames bei 25 fps = 00:01:33.21 = BCD : 00 01 33 21 h | 00 00 00 40 h = 00 01 33 61 h
    9588 frames bei 25 fps = 00:06:23.13 = BCD : 00 06 23 13 h | 00 00 00 40 h = 00 06 23 53 h
    10336 frames bei 25 fps = 00:06:53.11 = BCD: 00 06 53 11 h | 00 00 00 40 h = 00 06 53 51 h

    Der eigentliche Trick ist es, Dezimal effizient in BCD umzuwandeln; dafür gab es mal einen Wettbewerb, wie man das am effizientesten hinkriegt - der Sieger-Algorithmus arbeitete in Assembler mit vier Befehlen (je zwei Bitverschiebungen und zwei Additions-Übertrags-Korrekturen, wenn ich mich recht erinnere). Trivial geht es aber auch so:

    {PASCAL}
    BCD := (Dez DIV 10) * 16 + (Dez MOD 10) {bzw. ((Dez DIV 10) SHL 4) + (Dez MOD 10)}

    /* C */
    BCD = (Dez / 10) * 16 + (Dez % 10) // bzw. ((Dez / 10) << 4) + (Dez % 10)

  • Die erste von Dir genannte Zeile dürfte es nicht geben, da in der letzten Stelle die Anzahl der Frames MODULO fps steht, also nur der Rest. 25 fps sind eine ganze Sekunde, damit kommt Deine zweite Zeile heraus.

    Gruß, zisoft

  • Moin,

    Zitat

    Die erste von Dir genannte Zeile dürfte es nicht geben,


    ..sehe ich auch so, aber Katjarella hat ja diese beiden Beispiele drin:

    Zitat


    112 = 00:00:00.30 = 30 = 25fps
    121 = 00:00:00.39 = 39 = 25fps


    Da hab ich erstmal nicht mehr weitergemacht... war auch müde!

    Gruß Karl

  • wau.. ihr seit echt schlaue Köpfe. Ich habe es leider nicht so mit Mathe und blicke da überhaupt nicht durch. Besonders bei Euren Formeln !!!

    Mein Hintergrund bei der gesammten Sache ist es , aus der Video / Audio Framezahl den BCD (DEZIMAL !!!) zu errechnen und in dann in den IFOs von einer DVD einzutragen. Ihr könnt ja Eure Formeln mal mit IfoEdit prüfen.
    1. Ladet mit IfoEdit eine IFO rein.
    2. geht zu VTS_PGCITI und wählt das VTS_PGC_1 aus
    3. scrollt runter bis zur ersten Cell_1: playback time (BCD) und tragt dort Euren Wert ein
    4. geht wieder hoch zum Anfang und prüft jetzt im PGC_1 die Cell 01 auf Richtigkeit.

    Ich hoffe Ihr habt verstanden :) Und wenn jemand eine Formel für mich hat, will ich ein kleine htm mit script schreiben, wo ich diesen wert errechnen kann. Oder wenns gut läuft gleich die IFOs "patchen" kann.

    Aber erstmal VIELEN Dank, das Ihr Euch überhaupt die Mühe macht und darüber nachdenkt. KLASSE !!!!!

  • Ich hab' da, wo ich gerade sitze, leider kein IfoEdit greifbar :D

    Überprüf' doch mal, ob bei

    Zitat von zisoft


    10336 frames bei 25 fps = 00:06:53:51

    ein korrektes Ergebnis herauskommt. Der Dezimalwert dafür ist 414545

    In welcher Script-Sprache soll's denn sein?

    Gruß, zisoft

  • Zitat von katjarella

    [Scriptsprache ist EGAL... hauptsache nicht so komplex :)

    Ok, hier ist ein PERL-Script dafür. Getestet aber nur für 25 fps. Für 30 fps sehe ich da noch ein Problem, da sich der 30fps-Code (11) nicht in BCD codieren lässt! --> 11000000

    Aber für PAL sollte es schon mal funktionieren.

    Aufruf z.B.: frames2bcd.pl 10336

  • Zitat von zisoft

    Ok, hier ist ein PERL-Script dafür. Getestet aber nur für 25 fps. Für 30 fps sehe ich da noch ein Problem, da sich der 30fps-Code (11) nicht in BCD codieren lässt! --> 11000000

    Aber für PAL sollte es schon mal funktionieren.

    Aufruf z.B.: frames2bcd.pl 10336


    Leider geht es wegen serverproblemen nicht zu laden :(

    Und dann noch perl ? naja habe ja ActivePerl drauf... mal sehen ob ichs in java oder basic übersetzen kann.. wenn ich nur Script schon hätte :)

  • Zitat von katjarella

    Und dann noch perl ? naja habe ja ActivePerl drauf...

    Hab' ja extra vorher gefragt, welche Script-Sprache...

    Das Ding ist ja nur ganz kurz, deshalb hier für Copy&Paste:

    Und mit ActivePerl läuft es definitiv, hab' ich auch.

    Gruß, zisoft

  • Zitat von zisoft

    Hab' ja extra vorher gefragt, welche Script-Sprache...

    Und mit ActivePerl läuft es definitiv, hab' ich auch.

    Wieder WAU jedoch rechnet er nicht 100% !!!
    ABER FAST und das ist schon mal gut :)

    perl frames2bcd.pl 4770
    00:03:10:60
    200800
    ist aber 00:03:10.20 / 25 fps

    perl frames2bcd.pl 5615
    00:03:44:55
    214101
    ist aber 00:03:44.15 / 25 fps

    perl frames2bcd.pl 8405
    00:05:36:45
    341573
    ist aber 00:05:36.05 / 25 fps

    perl frames2bcd.pl 1000
    00:00:40:40
    16448
    ist aber 00:00:40.00 / 25 fps

    kommt also fast hin !!! Bei -40 also noch 40 Frames abziehen :)

    Ist aber egal der BCD stimmt ja !!!!! :daumen:

  • Das sind im letzten Wert immer genau die 40 zuviel, die ich in der Zeile

    Code
    my $frames_rest = ($frameNo % $fps) + $fps_code;

    dazu addiere. Ich dachte, der fps-code muss in den Dezimalwert mit eincodiert werden? Oder soll er nur bei der Klartext-Zeile

    00:03:10:60

    nicht dargestellt werden, im Dezimalwert aber enthalten sein?

    Dann nimm dieses script:

    Gruß, zisoft

  • Zitat von katjarella

    Also zisoft Du bist MEIN HELD des Tages !!!!!

    Da ich so oder so PAL liebe ist das mit der NTSC Möglichkeit nicht soooo wichtig.

    Liebe Jungs, was kann ich Euch gutes tun ? Aber allen erstmal ein dickes küsschen !!!!!!!!

    :redface:

    War mir ein Vergnügen ;)
    Da der fps-code jetzt aber nicht mehr in der Klartextausgabe enthalten ist, sollte es auch für NTSC korrekt funktionieren.

    Gruß, zisoft

Jetzt mitmachen!

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