Opus. Kompresja dzwięku z SFML
Ostatnio zmodyfikowano 2015-12-01 21:56
Niki-Nick Temat założony przez niniejszego użytkownika |
Opus. Kompresja dzwięku z SFML » 2015-11-30 19:37:54 Witam, przesyłam dźwięk nagrany za pomocą SFML przez sockety. Chciałbym go kompresować i dekompresować. Korzystam przy tym z Opus. Niestety, nie do końca wiem jak to zrobić. buffer.loadFromFile( "sample.wav" ); const short int * Probko = buffer.getSamples(); size_t liczba = buffer.getSampleCount(); cout << buffer.getChannelCount() << endl; cout << buffer.getSampleCount() << endl;
unsigned char * wynik2; int wynik; int blad; OpusEncoder * enc = opus_encoder_create( SAMPLE_RATE, CHANNELS, APPLICATION, & blad ); cout << blad << endl; wynik = opus_encode( enc, Probko, 2880, wynik2, 4000000 );
cout << wynik;
Wynik jest liczbą bajtów. Jeżeli jest ujemna, to wystąpił błąd. Co zrobiłem źle? |
|
maly |
» 2015-12-01 07:08:24 W opus_encode bufor wyniku powinien być wcześniej zaalokowany i mieć wielkość równą max_data_bytes czyli w Twoim przypadku 4000000. |
|
Niki-Nick Temat założony przez niniejszego użytkownika |
» 2015-12-01 16:52:04 wynik2 = new unsigned char[ 40000000 ]; wynik = opus_encode( enc, Probko, 1920, wynik2, 4000000 ); cout << opus_strerror( wynik );
delete[] wynik2;
Wciąż -1. Teraz mam informację że jest to "invalid argument" Wydaje mi się że chodzi raczej o zmienną "Probko" oraz następny argument w funkcji opus_encode |
|
jankowalski25 |
» 2015-12-01 21:56:01 Jakie są wartości SAMPLE_RATE , CHANNELS oraz APPLICATION ? Sampling rate of input signal (Hz) This must be one of 8000, 12000, 16000, 24000, or 48000. |
Pamiętaj, że jeśli używasz wyrażenia typu const opus_int32 SAMPLE_RATE = buffer.getSampleRate(); , to wtedy SAMPLE_RATE może mieć inną wartość, niż dopuszczalna przez bibliotekę Opus, czyli na przykład 44100 . //edit: Sprawdź, czy nie pomyliłeś przypadkiem metody getSampleCount() z metodą getSampleRate() . |
|
« 1 » |