Byte-Reihenfolge einer AC3 Datei mit dem Tool > AC3SWAP.EXE < korrigieren.
1. Einleitung
Ab und zu findet man in den Foren Themen wie dieses: TMPGEnc verweigert die Annahme einer AC3 Datei mit der Fehlermeldung > Illegal MPEG audiostream < .
Fast immer handelt es sich dabei um AC3 Dateien, die mit kommerziellen, zertifizierten Encodern erstellt wurden.
Dieses Verhalten wird noch ominöser, wenn die gleiche AC3 Datei auf einem Player mit DirectShow-AC3-Decoder problemlos abspielbar ist.
Die Ursache liegt in der falschen byte Reihenfolge (byte order) der AC3 Datei.
2.0 AC3 Spezifikation
Der AC3 Datenstrom ist in Pakete, die sogenannten frames, aufgeteilt. Jedes dieser Pakete
besteht aus einem header und den eigentlichen Audio-Daten und dauert 32ms. Im header sind alle Informationen untergebracht, die ein AC3 Decoder benötigt, um
* eine Datei als AC3 Datenstrom zu identifizieren
* die Audiodaten zu synchronisieren
* eine Fehlererkennung durchzuführen
* die Anwendervorgaben zu erkennen (Kanalzahl, Sample Rate usw.)
AC3 ist ein 16 bit Datenstrom, deshalb werden jeweils 2 byte zu einem Datenwort (word) zusammengefaßt.
Das erste word eines frames ist grundsätzlich immer das syncword 0B 77h. Daran erkennen sowohl Decoder als auch Muxer (z.B. TMPGEnc), daß es sich um eine AC3 Datei handelt.
Danach folgen 2 byte für den Fehlertest cyclic redundancy check 1 , gefolgt vom
sample rate code, der wiederum zusammengelegt ist mit dem frame size code usw.
Ein 2-Kanal AC3 Datenstrom mit 48kHz/192 kbps beginnt mit folgender Bitkombination:
(0B 77 xx yy 14 40)h, xx yy stehen für den CRC1 Test, sie variieren.
2.1 Byte order des Datenstroms
Es gibt zwei Möglichkeiten, ein 2-byte word zusammenzusetzen:
1. Das höherwertige byte erscheint zuerst, dann das niederwertige. (little endian)
2. Das niederwertige byte erscheint zuerst, dann das höherwertige. (big endian)
Angewandt auf den AC3 Datenstrom von 2.0 ergeben sich daraus folgende Möglichkeiten:
1. Gemäß ATSC Standard, Revision A von 2001: 0B 77 xx yy 14 40...
2. Gemäß Hausnorm des Encoder Vertreibers: 77 0B yy xx 40 14...:mad:
2.2 Wie erkenne ich den Datenstromtyp ?
Unter der Voraussetzung, daß ein DirectShow-AC3 Decoder auf dem PC installiert ist, kann mittels Graphedit und AC3Filter eine Aussage gemacht werden, um welchen Typ es sich handelt. Dazu die AC3 Datei starten und AC3 Filter öffnen. Erscheint unter > Decoder info < in der 5. Zeile > stream: 16bit big endian <, dann sind high- und low bytes vertauscht.
2.3 Verändern der byte order mit dem Tool > AC3SWAP.EXE vers 1.0 <
Der Vorgang des Vertauschens einer bestehenden byte order heißt swapping und genau dies
macht das kleine Kommandozeilenprogramm AC3SWAP.
Am einfachsten funktioniert dies, wenn AC3SWAP und die AC3 Datei im gleichen Verzeichnis stehen.
Die Kommando-Eingaben > ac3swap SourceFile.ac3 < und > RETURN < starten den
swap Vorgang, wobei > SourceFile.ac3 < ein beliebiger Dateinamen sein darf.
Das Programm macht nun folgendes:
Einlesen: word 1 mit byte order H/L => speichern von word 1 mit byte order L/H
Einlesen: word 2 mit byte order H/L => speichern von word 2 mit byte order L/H usw.
Die ursprüngliche Quelldatei wird dabei nicht verändert, es erscheint eine neue Datei
> s_SourceFile.ac3 <, in der die byte order nun richtig ist; AC3 Filter zeigt > stream: 8bit <
Einschränkungen:
Die AC3 Datei sollte vom Typ > Even < sein, d.h. die Gesamtanzahl der bytes muß durch
2 ohne Rest teilbar sein. Ist sie das nicht, dann ist entweder ein byte "abhanden" gekommen oder es wurde ein vagabundierendes byte (von wo auch immer...) eingefangen (Die Vogelgrippe grassiert zur Zeit im Lande ...). Passiert dieser Fehler am Ende der Datei, dann ist das nicht weiter schlimm, und es könnte u.U. nur ein "Klick" im letzten audio frame entstehen. Beginnt die Datei nicht mit einem vollständigen synchword, dann wird u.U. die Zieldatei unbrauchbar sein!
Ist SourceFile.AC3 eine Datei vom Typ > Odd <, erscheint die Meldung:
Odd file size, target could be unusable, use an hexeditor!
Fehlt nur das erste byte, so kann man mittels eines Hexeditors und der > Insert string < Funktion die Datei ergänzen. Fehlt mehr, dann hilft nur noch das Entfernen des ersten frame Fragments bis vor das synchword des nächsten frames. Diese Änderungen müssen an der Quelldatei vorgenommen werden, bevor AC3SWAP die bytes vertauscht.
AC3SWAP ist Freeware und darf ohne Einschränkungen genutzt werden. Das Programm
wurde in C++ geschrieben und compiliert mit dem Freeware C++ Compiler Dev-C++ 4.9.9.2.
Viel Erfolg beim Swappen ...;D