[Perl] hex knippen/plakken in een file

Pagina: 1
Acties:

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Hallo,

Is het mogelijk om met Perl een file van 800Mbyte te doorzoeken op een bepaalde string '0x47' en te kijken of deze string elke 204 bytes herhaald en dan het begin van de file af te knippen waar dat niet plaatsvindt.

Waarom vraag ik dit, daar we DVB-S opnamen maken van de Astra (MPEG2-TS) en het heel af en toe voor komt dat het begin van de file corrupt is waardoor we deze niet meer kunnen transcoden met Mencoder. De file blijkt na een seconde of 5 wel goed te zijn (VLC begin namelijk beeld te produceren na een seconde of vijf).
Door nu +/- 5 sec aan data van het begin van de file af te knippen en daarna te zoeken op dit patroon zouden we hopelijk de TS-file zo kunnen fixen dat we hem alsnog kunnen recoden naar H264.

We werken op Linux: Debian en zoeken alleen naar commandline oplossingen ivm automatiseren.


Alvast hartelijk dank

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Mmmmm had niet verwascht dat dit zo moeilijk zou zijn.
Ben iig iets verder gekomen. Een byte printen in 0xFF waarden blijkt niet zo eenvoudig te zijn als ik dacht. Heb inmiddels wel een routine gevonden om n x bytes in te lezen maar het uitprinten ervan levert complete rotzooi op het scherm op. Ik had verwacht dat je een 4 byte grote array op deze manier kon printen
code:
1
printf("%x%x%x%x,$array[0],$array[1],$array[2],$array[3]);

maar dat levert alleen maar 0-en op.

Hexedit gaf me inzage in de opnames en ik kwam tot de ontdekking dat het DVB opnames toch uit n x188bytes bestaan. En dat zelfs in de foute opnamen de 0x47 startbyte waarde van elk pakket langskwam. Dus analyse is niet zo interessant meer. Zal nu proberen alleen met een x offset in te lezen en in een nieuwe file weg te schrijven. Eens kijken of een string 800Mbyte groot mag zijn...... Perl zegt van wel

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Voor zulke grote files moet je eens kijken naar de Perl versie van mmap.
http://search.cpan.org/~swalters/Sys-Mmap-0.13/Mmap.pm

Dan moet niet de hele file worden ingelezen, maar kan je de file toch benaderen als een lap geheugen.

Verder denk ik dat je misschien wat in de war bent met hexadecimale notatie ?
Als je wil kijken of een bepaalde byte 0x47 is dan doe je dat:

if( mijn_grote_array[$c] == 0x47){
# Checken of het n bytes verder ook voorkomt
}

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Zijn we weer en we zijn wat stapjes verder. Helaas nog geen hulp gehad op het HEX uitprinten van een file. Wel lukt het om nx188bytes van het begin van de MPEG TS stream af te halen zodat er een file overblijft die Mencoder accepteert als geldige input. De code hiervoor is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$FILENAME = '/test/video.ts';
$FILESIZE = -s $FILENAME;

open(FILE_1, $FILENAME)  or die "can't open $filename: $!";
binmode(FILE_1);

$RECSIZE = 188;
$ADDRESS = $RECSIZE * (1024*64);
seek(FILE_1, $ADDRESS, 0) or die "seek:$!";
$REST = $FILESIZE - $ADDRESS;
read(FILE_1, $BUFFER, $REST);

close FILE_1;
open FILE_2, ">/video_resized.ts" or die $!; print FILE_2 $BUFFER;


Nu hoop ik dat iemand nog een oplossing weet om een string van nxbytes te printen in een leesbaar formaat. Dus '01 ff 40 A5' etc
Ik heb al printf("%x", $buffer); print hex($buffer) geprobeerd, maar geeft allemaal rare tekens op het scherm. Alvast bedankt.

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 15-10-2025

ripperke

w00t!

Geen oplossing voor je perl "probleem", maar ik denk dat je zeker eens naar ProjectX moet kijken: http://sourceforge.net/projects/project-x/

Dit programma is echt uitermate goed om TS files te fixen...

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


  • luteijn
  • Registratie: Maart 2008
  • Laatst online: 16-12-2022
> cat aap.pl


my @aap=unpack("c*","RTFM");
print STDERR "@aap\n";

my $noot="";
for (;@aap;) {
$noot.=sprintf("%02X ",shift(@aap));
}
print STDERR "$noot\n";

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
@ripperke
Ken dat pakket net als TSdocter, echter dat is niet commandline. We willen de computer alles laten doen, ben een beetj lui ;)
Dus zoiets als
code:
1
fix-ts-stream <name ts-file>


Alleen dat lijkt (nog) niet te bestaan

[ Voor 27% gewijzigd door gepebril op 21-08-2009 15:45 ]


  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 15-10-2025

ripperke

w00t!

ProjectX werkt prima commandline hoor...

fyi

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
quick CL usage:
Note: CL doesn't load the GUI components, except with switch [-gui]
<without options>  ...starts the GUI
switches and inputfiles can be in any order

options:
[-ini <path + inifile>] ..use that specified iniFile instead of the standard
[-dvx1] ..create a .d2v ProjectFile on demux
[-dvx2] ..create a .d2v ProjectFile + .ac3.wav (RIFF WAVE Header)
[-dvx3] ..create a .d2v ProjectFile + .mpa.wav (RIFF WAVE Header)
[-dvx4] ..create a .d2v ProjectFile + .ac3.wav + mpa.wav (RIFF WAVE Header)
[-out <path>] ..use that specified directory for output
[-name <filename>] ..use that specified filename for output
[-cut <file>] ..use that text based file as cutpoint list
[-chp <file>] ..use that text based file as chapterpoint list
[-id <tokens>] ..use only these (P)IDs, separated by comma ","
[-gui] ..display the GUI using all given CLI options
[-log] ..write the normal logfile
[-saveini] ..save changes made bei CLI in active .ini
[-split <xxx>] ..split output at xxx MB
[-demux, -tom2p, -topva, -tovdr, -tots, -filter] ..action types

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
@luteijn,

Dank je wel voor de macho programming demo. Niet echt de meest heldere code om te lezen voor mij, het is echter wel krachtig en snel denk ik. For next lussen zonder start element en zonder step element..... wist niet dat, dat kon.
Is precies wat ik nodig had bleek in tweede instantie.

Heb heel lang naar deze oplossing gegoogled, echter niet gevonden. De meeste manuals zijn erg cryptisch en missen heldere praktische voorbeelden en focussen zich meer op zo veel mogelijk doen met zo min mogelijk regels. Terwijl dat laatste juist steeds minder interessant word door alle code optimalisering en snellere CPU's.

Helaas zal het ook wel een dying art worden .... :/

[ Voor 50% gewijzigd door gepebril op 21-08-2009 16:33 ]


  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
@ripperke
Ok, dat wist ik niet nou nog een optie a la
code:
1
projextx -i <inputfile> -o <outputfile> -fix

Dan zou het kunnen doen waarvoor ik het nodig heb. Aan de commandos te zien is het meer een progje om via command line stukjes eruit te halen

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 15-10-2025

ripperke

w00t!

code:
1
java -jar ProjectX.jar <input.ts>


dit zal je een perfect werkende <input>.m2v & <input>.ac3 opleveren (die je dan kan gebruiken in mencoder)

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
@ripperke,
Ok...... dat klinkt goed alleen zitten in de DVB streams die ik altijd opneem mp2 audio als ik me niet vergis.(canaal digitaal) dus dat input.ac3 kan ik dan weggooien....... Of transcode projectx automatisch elke audio stream naar ac3 codering?

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 15-10-2025

ripperke

w00t!

ProjectX doet niet aan transcoding, enkel aan demuxen, dus als in jouw ts stream 2 mp2 streams zitten zal ProjectX ook 2 mp2 streams wegschrijven. Zit er een ac3 stream in zal ie een ac3 stream wegschrijven, etc etc

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Ok, ik begrijp ik zie trouwens bij de opties (flags) staan -demux en -tots. Dat impliceert dat je ook een stream kunt fixen zonder te demuxen....en gewoon ts kan laten?
Of krijg je dan het probleem dat hij het origineel niet wel/kan overschrijven. Als ik het goed begrijp moet het ook zo kunnen?
code:
1
java -jar ProjectX.jar <input.ts> -tots -name <output.ts>

Heb ik het bij het rechte eind? En dat produceert hij output.new.ts

IIG heel, heel erg bedankt ripperke. Zo zie je maar weer dat een oplossing uit een hele andere hoek kan komen. Als je in Paramaribo bent kom je maar even een lekker Surinaams biertje doen. En er is hier meer leuk dan alleen Damaru ;)

@ripperke hoe krijg jij je fotootje/icoontje bij alle reacties? Ik heb ook een foto geupload, maar bij mij is hij niet zichtbaar......

[ Voor 34% gewijzigd door gepebril op 21-08-2009 20:17 ]

Pagina: 1