Автор Тема: auidio неро image, или .nrg  (Прочетена 3803 пъти)

july

  • Напреднали
  • *****
  • Публикации: 324
    • Профил
auidio неро image, или .nrg
« -: Feb 28, 2006, 16:49 »
понеже скоро ми се наложи да поразръчкам малко *.nrg image-та
а не исках да боотвам в уин (не че там имам пиратски софтуер де'<img'>

реших да се справям сам, както намеря за добре...

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 и оттам нататък да му мисли програмата за записване....
но вече задълбал из толкова байтове и сектори реших, че може и по друг начин'<img'>
cdrecord -audio track.....
понеже track не ми завършваха на .wav cdrecord ги прие като бинарен образ на audio сектори...
и понеже големината им е кратна на 2352, не ме "наплю" като в предни случаи '<img'>

ами това...
Очертава се скоро пак да направя упражнението'<img'> та ако има интерес, бих могъл да документирам по-подробно процеса, и да дам и примери '<img'> , да се получи нещо като step by step...

п.с. преди доста време бях мернал коментар в един тракер, че .nrg не ставало за под линукс... та и това има принос да се реша да го направя the right way
Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
auidio неро image, или .nrg
« Отговор #1 -: Feb 28, 2006, 17:15 »
Пич евала за нервите да си играеш с таквиз работи. '<img'>

Наистина няма да е зле едно по-подробно и детайлно описание на нещата, което като нищо може да отиде в wiki.linux-bg.org.
Активен

july

  • Напреднали
  • *****
  • Публикации: 324
    • Профил
auidio неро image, или .nrg
« Отговор #2 -: Mar 01, 2006, 13:25 »
наложи ми се'<img'>
и понеже съм мързел'<img'>

взех та модифицирах 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  '<img'>

и се изпълняват изпринтените команди...
кода съм се постарал да го коментирам...
ако някой иска да го тества, нека сподели впечатления...

Примерен код


/*
   01/05/2003 Nrg2Iso v 0.1

   Copyright (C) 2003 Gr&#233;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;
  
}




Активен

july

  • Напреднали
  • *****
  • Публикации: 324
    • Профил
auidio неро image, или .nrg
« Отговор #3 -: Mar 01, 2006, 14:25 »
хммм, явно си зависи и от версията на неро...

засега най-точния критерий е че парче номер hex AA (170)
е таг-а за край на трак листинга....
модификацията е лесна...
Активен

july

  • Напреднали
  • *****
  • Публикации: 324
    • Профил
auidio неро image, или .nrg
« Отговор #4 -: Mar 02, 2006, 11:22 »
за тестване на audio cd-то
не ползвайте vlc  '<img'>

просто плейъра чете кажи речи всичко

всъщност, цялата галимация е заради dts audio cd-та
които искам да слушам на самостоятелен player

по гореописания начин си extrac-твам траковете, пека ги, хващат се в freedb.org  , vlc си ги чете като за световно...
но на домашния player, njente.... само шум....

със vlc и dtsdec изглеждат по един и същи начин...

е да де, ама vlc много културно проверява дали stream-а е little endian или е big endian ... '<img'>  '<img'>  '<img'>

та обърнах endian-а на един трак и ги записах и двата варианта
довечера ще видя какво се е получило...

п.с. vlc-то пак си play-ва и двата трака така както трябва, докато при mplayer, обърнатия трак е по-друг начин (и двата са шум, но обърнатия трак ми прилича на верния шум'<img'>

като тествам, ще дам feedback...
Активен

july

  • Напреднали
  • *****
  • Публикации: 324
    • Профил
auidio неро image, или .nrg
« Отговор #5 -: Mar 02, 2006, 19:55 »
давам, feedback,
бачка като фурия'<img'>

ако някой иска кода за swap на endian-а да се обади, че сега е на друго пц в момента...
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
конвертиране на cd image с k3b
Настройка на програми
vic_semionov 6 3111 Последна публикация Sep 14, 2004, 13:23
от vic_semionov
Как се прави ISO image на CD-ROM?
Настройка на програми
varbancho 5 5293 Последна публикация Nov 20, 2004, 17:51
от
Mac OS image convertion
Настройка на програми
temsata 2 1609 Последна публикация Apr 14, 2005, 18:19
от temsata
Компилиране на kernel-image.
Настройка на програми
yamahadrums 6 2421 Последна публикация Aug 30, 2005, 12:00
от Lord Bad
Работа с image файлове
Настройка на програми
dual_OS 3 2667 Последна публикация Oct 30, 2005, 17:06
от vstoykov