Титла: auidio неро image, или .nrg
Публикувано от: july в Feb 28, 2006, 16:49
понеже скоро ми се наложи да поразръчкам малко *.nrg image-та а не исках да боотвам в уин (не че там имам пиратски софтуер де реших да се справям сам, както намеря за добре... 1-во след малко търсене се натъкнах на nrg2iso от Grgory Kokanosky името говори достатъчно (nrg2iso), естествено това нещо пак не проработи при мене (едно поради факта, че явно напоследък неро прави бинарни образи, едно поради факта че в конкретния случай образа е на audio, което дефакто пак е бинарен... както и да е) След разглеждане на кода на nrg2iso, се разбира че ако файла не е iso, то при копиране от 307200-я байт до края, става iso... естествено това пак не проработи при мене, но даде няколко важни насоки... 1-во, тези 307200 (150*2048) байта евентуално са служебни неровски 2-ро, това са точно 150 сектора, ако сектора е 2048 байта... веднага проверих, ако махна на .nrg image-то първите 150 сектора (всеки по 2352 байта, все пак е аудио image), какво ще се получи... получи се прекрасно (бяха 0-ли всичките, в този конкретен пример) 2-ро, След като имаме един бинарен image, как да го..... разбира нерото откъде докъде са му траковете?! ----2.1 първия ми опит (също успешен), беше доста заобиколен, но работеше.... сложих wav header, нагласих cue-file, според броя и дължината на парчетата и воаля, опече се като слънце, т.е. и във freedb.org се изнамираше... ----2.2 Ами след малко тест, се оказа че важната информация си почва директно още в началото на файл-а.... ок, погледнах накрая и воаля, открои се интересен "таг" CUEX след него има информация от вида (във big endian format): ....01 .....XXXXXX ...... 01... XXXXXX+96 ....02------------------02-------- ... ...YZ--------------------YZ--------- 01 до YZ е номер на трака, а XXXXXX се оказа offset от началото (на вече стрипнатия файл) във сектори...(hex) последва begin= i_offset; length= i+1_offset; dd if=audio.nrg of=track_i skip=begin count=length bs=2352 и имах траковете поотделно... тествах ги, точно те бяха (първо погледнах какво има на съответните offset-и) остана въпроса със записването на cd... единия вариант, е като 2.1 wav header и оттам нататък да му мисли програмата за записване.... но вече задълбал из толкова байтове и сектори реших, че може и по друг начин cdrecord -audio track..... понеже track не ми завършваха на .wav cdrecord ги прие като бинарен образ на audio сектори... и понеже големината им е кратна на 2352, не ме "наплю" като в предни случаи ами това... Очертава се скоро пак да направя упражнението та ако има интерес, бих могъл да документирам по-подробно процеса, и да дам и примери , да се получи нещо като step by step... п.с. преди доста време бях мернал коментар в един тракер, че .nrg не ставало за под линукс... та и това има принос да се реша да го направя the right way
Титла: auidio неро image, или .nrg
Публикувано от: Hapkoc в Feb 28, 2006, 17:15
Пич евала за нервите да си играеш с таквиз работи. Наистина няма да е зле едно по-подробно и детайлно описание на нещата, което като нищо може да отиде в wiki.linux-bg.org.
Титла: auidio неро image, или .nrg
Публикувано от: july в Mar 01, 2006, 13:25
наложи ми се и понеже съм мързел взех та модифицирах ngr2iso.c -to... не мога да кача attachment, така че ще пейстна по надолу кода... иначе ето как се и ползва... Примерен код | /a.out Led\ Zeppelin\ -\ Led\ Zeppelin\ IV.nrg the value is 453679632 or in hex 1B0A9A10 the is is not stripped stripped from nero 0000 track 1 zapochva na 352800 ili vyv hex 56220 i e dylga 52633056, vyv hex 3231DE0 dd if="Led Zeppelin - Led Zeppelin IV.nrg" of=track1 bs=2352 skip=150 count=22378 track 2 zapochva na 52985856 ili vyv hex 3288000 i e dylga 39137280, vyv hex 2553000 dd if="Led Zeppelin - Led Zeppelin IV.nrg" of=track2 bs=2352 skip=22528 count=16640 track 3 zapochva na 92123136 ili vyv hex 57DB000 i e dylga 62151600, vyv hex 3B45BB0 dd if="Led Zeppelin - Led Zeppelin IV.nrg" of=track3 bs=2352 skip=39168 count=26425 track 4 zapochva na 154274736 ili vyv hex 9320BB0 i e dylga 84867216, vyv hex 50EF890 dd if="Led Zeppelin - Led Zeppelin IV.nrg" of=track4 bs=2352 skip=65593 count=36083 track 5 zapochva na 239141952 ili vyv hex E410440 i e dylga 49815360, vyv hex 2F81F40 dd if="Led Zeppelin - Led Zeppelin IV.nrg" of=track5 bs=2352 skip=101676 count=21180 track 6 zapochva na 288957312 ili vyv hex 11392380 i e dylga 50375136, vyv hex 300A9E0 dd if="Led Zeppelin - Led Zeppelin IV.nrg" of=track6 bs=2352 skip=122856 count=21418 track 7 zapochva na 339332448 ili vyv hex 1439CD60 i e dylga 37629648, vyv hex 23E2ED0 dd if="Led Zeppelin - Led Zeppelin IV.nrg" of=track7 bs=2352 skip=144274 count=15999 track 8 zapochva na 376962096 ili vyv hex 1677FC30 i e dylga 76717536, vyv hex 4929DE0 dd if="Led Zeppelin - Led Zeppelin IV.nrg" of=track8 bs=2352 skip=160273 count=32618
|
за тестване се пуска със | grep dd
и се изпълняват изпринтените команди... кода съм се постарал да го коментирам... ако някой иска да го тества, нека сподели впечатления...
Примерен код |
/* 01/05/2003 Nrg2Iso v 0.1
Copyright (C) 2003 Grégory Kokanosky <gregory.kokanosky@free.fr>
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details.
You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#define _FILE_OFFSET_BITS 64 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <sys/stat.h> #define VERSION "0.4" #define SECTOR_SIZE 2352 // 2048 is sector size in bytes for data or 0x800 // 2352 is sector size in bytes for audio or 0x930
unsigned long gen_offset=0;//izpolzva se samo pri offsetite na trackovete! v baytove e! unsigned long cuex_offset=0;//offseta na CUEX-a char* gen_name;
void usage(){ printf("Nrg2Iso v%s by G. Kokanosky\n", VERSION); printf("released under the GNU GPL v2 or later\n\n");
printf("Usage :\n"); printf("nrg2iso image.nrg image.iso\n\n"); printf("--version display version number\n"); printf("--help display this notice\n\n");
}
char* is_stripped(FILE *filename, unsigned long offset) { // proveriava dali e strpnat ot 0-lite ili ne i setva general offset... // prosto vyv cue-sectiona, offsetite vyv sectori na trackovete sa // dadeni ne ot nachaloto na faila, a ot nachaloto na dannite, t.e. 150+ sectora... unsigned char buffer[8]; char* resil;
fseek (filename, offset, SEEK_SET); fread (buffer,1,8,filename); if ( buffer[0]=='C' && // hex 43 buffer[1]=='U' && //hex 55 buffer[2]=='E' && //hex 45 buffer[3]=='X') { //&& //hex 58 gen_offset=150*SECTOR_SIZE;//da opravim gen_offset v bytes! // shtom sme namerili cue-sectiona na tozi offset, znachi imame vodeshti nuli i syotvetno triabva da pribavim 150 sectora kym offsetite na trackovete // return "is not stripped"; }; // end na if-, za CUEX return "moje i da e stripped"; } // end na is_stripped
void parse_tracks(FILE *filename) { // tova parsva trackovete.... //1B0A9A10 43 55 45 58 00 00 00 90 01 00 00 00 FF FF FF 6A CUEX...........j //1B0A9A20 21 01 00 00 FF FF FF 6A 21 01 01 00 00 00 00 00 !......j!....... //1B0A9A30 21 02 00 00 00 00 57 6A 21 02 01 00 00 00 57 6A !.....Wj!.....Wj //1B0A9A40 21 03 00 00 00 00 98 6A 21 03 01 00 00 00 98 6A !......j!......j //1B0A9A50 21 04 00 00 00 00 FF A3 21 04 01 00 00 00 FF A3 !.......!....... //1B0A9A60 21 05 00 00 00 01 8C 96 21 05 01 00 00 01 8C 96 !.......!....... //1B0A9A70 21 06 00 00 00 01 DF 52 21 06 01 00 00 01 DF 52 !......R!......R //1B0A9A80 21 07 00 00 00 02 32 FC 21 07 01 00 00 02 32 FC !.....2.!.....2. //1B0A9A90 21 08 00 00 00 02 71 7B 21 08 01 00 00 02 71 7B !.....q{!.....q{ //1B0A9AA0 01 AA 01 00 00 02 F0 E5 44 41 4F 58 00 00 01 66 ........DAOX...f // // infoto izlgejda kato gore.... // vijdal sym image (.nrg) na kojto 5,6,7,8 i 13,14,15,16 // ne obrazuvat edin i syshti offset, a sys razlika 150 (hex 96) // az priemam che 13-16 byte, sa po-vernite i gi parsvam tiah // int tracks=0; unsigned long temp=0; unsigned long* tr_offsets;//tuka shte pisheme offsetite, za da moje da smiatame razni krasoti za dd-to #define pat_size 16 //16 byte , miaza da e na nero patterna unsigned char buffer[pat_size];//16 bytes, miaza da e na nero patterna...
fseek (filename,cuex_offset+pat_size,SEEK_SET);//otivame na "reda" sled CUEX fread (buffer,1,pat_size,filename);// read the first pattern, hope that we have at least 1 track:). while ( buffer[0]==33 ) { // miaza che hex 01 AA 01 00 02 e kraja na opisanieto na trackovete, no pyk te zapochvat sys 21, taka che proverkata shte e po razlichie ot 21 temp=buffer[15]+ buffer[14]*256+ buffer[13]*256*256+ buffer[12]*256*256*256+ buffer[11]*256*256*256*256; //t.e. na 12 do 16 byte, v e offseta v sectori... shte triabva da se proveri, dali 5,6,7,8 ne sa po-koretni, no spored men ne sa temp=temp*SECTOR_SIZE+gen_offset;//offsetite koito chetem sa v sectori...pribaviame i 150-te sectora ot vodesthi 0-li, ako gi ima... tr_offsets[tracks]=temp; //printf ("\n\ntemp is %u, trof is %u\n",temp-gen_offset,tr_offsets[tracks]-gen_offset); //printf ("\n\n\n\n prochetoch track %d",tracks); //printf ("\nbuffer[0] e %c ili %d",buffer[0],buffer[0]); //printf ("\noffseta as read e %u ili %X",temp-gen_offset,temp-gen_offset); fread (buffer,1,pat_size,filename); //chetem sledvashtia red
tracks++;// broim i kolko sa trackovete... }//end na while za tracks tr_offsets[tracks]=cuex_offset;//tova ni dava markera na kraja na poslednata pesen // polzvame go za da smetnem dyljinata na poslednata pesen....
for (temp=0;temp<tracks;temp++) { printf ("\ntrack %d zapochva na %u ili vyv hex %X i e dylga %u, vyv hex %X\n",temp+1,tr_offsets[temp],tr_offsets[temp],tr_offsets[temp+1]-tr_offsets[temp],tr_offsets[temp+1]-tr_offsets[temp]); printf ("dd if=\"%s\" of=track%d bs=2352 skip=%u count=%u",gen_name,temp+1,tr_offsets[temp]/2352,(tr_offsets[temp+1]-tr_offsets[temp])/2352); // so gornite dva reda, printim info kakvo sme otkrili i kakvo smiatame da napravim... // printf ("%u\n",temp); // printf ("%u ili %X\n",tr_offsets[temp]-gen_offset,tr_offsets[temp]-gen_offset); }//end na obhojdaneto }//end na parse_tracks
#define NUM_OF_COLUMNS 70 int main(int argc, char **argv){ FILE *nrgFile, *isoFile; unsigned char buffer[8]={0,0,0,0,0,0,0,0};// da pobira 8 bytes:) unsigned long value=0; size_t i=0,j=0; size_t size=0,k=0,l; size_t nrgSize=0; int percent = 0; int old_percent = -1; struct stat buf; if( argc==2 && (strcmp(argv[1],"--version") == 0) ){ printf("nrg2iso v%s\n", VERSION); return 0; } if( stat(argv[1],&buf)==0){ gen_name=argv[1]; nrgFile=fopen(argv[1],"rb"); // we have to read, the last few bytes, to see, where the CUEX is, and we will see, if we have trailing 00, too // poslednite 8 baita ot .nrg -to sa offset v baitove, otkydeto zapochva cue-seckiata.... fseek (nrgFile, -8, SEEK_END); // seek to the last 8 bytes
if ( fread( buffer, 1, 8, nrgFile)==8 ){ // read the last 8 bytes value = buffer[7]+ buffer[6]*256+ buffer[5]*256*256+ buffer[4]*256*256*256; cuex_offset=value;// setvame globalno kyde e offseta printf ("the value is %u or in hex %X\n",value,value); // towa e za debuging, ako neshtata ne prorabotiat kakto triabva printf ("the is %s stripped from nero 0000",is_stripped(nrgFile,value));// da kajem kakvo sme otkrili... idejata e che ako na prochetenie po-gore offset ima CUEX, to znachi si imame i trailing 00 na neroto (150 sectora) // principno shtom e nero, znahci gi ima...no vse pak, ako gi niama, da ni e lesno da prerabotim koda...., tuka vij is_stripped, predi parse_tracks parse_tracks(nrgFile); }; //end na if-a za fread } else printf("%s : No such file\n",argv[1]); fclose (nrgFile); return 0; }
|
Титла: auidio неро image, или .nrg
Публикувано от: july в Mar 01, 2006, 14:25
хммм, явно си зависи и от версията на неро...
засега най-точния критерий е че парче номер hex AA (170) е таг-а за край на трак листинга.... модификацията е лесна...
Титла: auidio неро image, или .nrg
Публикувано от: july в Mar 02, 2006, 11:22
за тестване на audio cd-то не ползвайте vlc просто плейъра чете кажи речи всичко всъщност, цялата галимация е заради dts audio cd-та които искам да слушам на самостоятелен player по гореописания начин си extrac-твам траковете, пека ги, хващат се в freedb.org , vlc си ги чете като за световно... но на домашния player, njente.... само шум.... със vlc и dtsdec изглеждат по един и същи начин... е да де, ама vlc много културно проверява дали stream-а е little endian или е big endian ... та обърнах endian-а на един трак и ги записах и двата варианта довечера ще видя какво се е получило... п.с. vlc-то пак си play-ва и двата трака така както трябва, докато при mplayer, обърнатия трак е по-друг начин (и двата са шум, но обърнатия трак ми прилича на верния шум като тествам, ще дам feedback...
Титла: auidio неро image, или .nrg
Публикувано от: july в Mar 02, 2006, 19:55
давам, feedback, бачка като фурия ако някой иска кода за swap на endian-а да се обади, че сега е на друго пц в момента...
|