Format WAV (pytanie) i problem z odczytem danych
Ostatnio zmodyfikowano 2012-10-21 13:39
m4tx |
» 2012-10-21 12:12:38 Nie rozumiem, dlaczego niektórzy piszą własne algorytmy wczytywania plików BMP czy WAV, skoro można skorzystać z szeroko używanych bibliotek do wczytywania PNG, czy OGG, ale... rób jak uważasz. :)
Co do Twojego kodu - przeleć debuggerem - zobaczysz, gdzie jest błąd. :) |
|
cyklopek11 |
» 2012-10-21 13:39:43 WavInfo loadWavData( char * filename ) { fstream plik( filename, ios::in | ios::binary ); WavInfo pliczek; int i = 44; char correct[ 44 ]; plik.read( correct, i ); char * data; while( !plik.eof() ) { plik.read( data, 2 ); pliczek.DATA.push_back(( int ) data ); } return pliczek; }
Myślę, że używanie vectora do wczytywania danych z pliku o danym formacie jest niepotrzebne. No chyba, że będziesz intensywnie przeprowadzał operacje insert lub erase (jednak to spowoduje prawdopodobnie uszkodzenie formatu). Ja pisząc sobie klasę do binarnej obsługi formatu EXE zrobiłem to podobnie do poniższego kodu (szczątkowa klasa którą bym rozbudował do obsługi formatu wav): #include <iostream> #include <fstream>
using namespace std;
typedef unsigned char BYTE;
class BinaryWave { public: BinaryWave(); BinaryWave( const char * fileName ); virtual ~BinaryWave(); BYTE * startFilePtr; BYTE * startInterestingData; size_t fileSize; bool LoadFile( const char * fileName ); void ShowDataBytesOnScreen( size_t fromIndex, size_t toIndex ) const; size_t GetFileSize(); };
BinaryWave::BinaryWave() : startFilePtr( 0 ) , startInterestingData( 0 ) , fileSize( 0 ) { }
BinaryWave::BinaryWave( const char * fileName ) { fstream file( fileName, ios::in | ios::binary ); file.seekg( 0, ios::end ); fileSize = file.tellg(); file.seekg( 0, ios::beg ); startFilePtr = new BYTE[ fileSize ]; file.read( reinterpret_cast < char *>( startFilePtr ), fileSize ); file.close(); startInterestingData = startFilePtr + 44; } BinaryWave::~BinaryWave() { delete[] startFilePtr; startFilePtr = 0; startInterestingData = 0; }
void BinaryWave::ShowDataBytesOnScreen( size_t fromIndex, size_t toIndex ) const { for( size_t i = fromIndex; i < toIndex; i++ ) { cout << *( startFilePtr + i ) << ", "; } }
size_t BinaryWave::GetFileSize() { return fileSize; }
int main() { BinaryWave pliczekWave( "MojPliczek.wav" ); pliczekWave.ShowDataBytesOnScreen( 0, pliczekWave.GetFileSize() ); cin.get(); return 0; }
Z doświadczenia powiem, że aby dobrze opanować format danego pliku trzeba: - "studiować" specyfikacje formatu z kilku (kilkanastu) różnych źródeł (około 49% wiedzy) - napisać od zera klasę obsługującą te pliki, mogące je binarnie zmieniać itd (51% wiedzy) Pisanie własnej biblioteki/klasy ma sens wtedy gdy: - istniejące darmowe biblioteki nie posiadają powiedzmy 90% funkcjonalności którą potrzebujemy - jeśli chcemy być uniezależnieni od typu licencji na podstawie której jest rozprowadzana dana biblioteka (chcemy mieć coś swojego i mamy dużo czasu) - chcemy z różnych powodów perfekcyjnie opanować znajomość danego formatu pliku - chcielibyśmy wykorzystać rozprowadzaną "darmową" bibliotekę w naszym komercyjnym (za mocno powiedziane) projekcie, a autor 2000 linijek swojego kodu c++ wycenił na 2000 Ojro :-) |
|
1 « 2 » |