Hallo,
ich habe folgende Problemstellung.
Ich habe eine .au Datei. Ich möchte diese einlesen, und folgende Informationen auslesen:
- Magic Number
- Data Offset
- Data Length
- Encoding
- Sampling Rate
- Audio Channels
- Audio Samples
Diese sind in den ersten 8 Bit versteckt.
Anschließend möchte ich auch das Audiofile komplett umdrehen. - Also sozusagen von hinten nach vorne abspielen und so speichern.
Komme aber beim einlesen mit open nicht zusammen.
Habe das bis jetzt probiert:
https://codeshare.io/wnZex9
Bitte um Hilfe. Vielleicht wer einen einfachen Code wie ich das File einlesen kann und als ich nehme an Binärdatei bearbeiten kann.
LG XY
.au File einlesen und verarbeiten
Re: .au File einlesen und verarbeiten
Hallo 
Nachdem dein verlinkter Code relativ kurz ist, poste ich ihn mal hier:
Wesentlich ist folgende Zeile:
Zum Vergleich, hier die Beschreibung zur "open" Funktion:
https://man7.org/linux/man-pages/man2/open.2.html
"open" erwartet sich den zweiten Parameter als Integer, nicht als String. Vielleicht wolltest du eigentlich "fopen" verwenden?
https://www.proggen.org/doku.php?id=c:tutorial:files
"w" steht weiters für "write", du willst aber aus der Datei lesen. Das heißt du bräuchtest im Fall von "open" eigentlich "O_RDONLY" (als Integer, nicht als String!) bzw. im Fall von "fopen" solltest du "rb" (für "read-binary") verwenden.
Also z.B.:
Oder:

Nachdem dein verlinkter Code relativ kurz ist, poste ich ihn mal hier:
Code: Alles auswählen
#include <stdio.h>
#include "netinet/in.h"
#include <fcntl.h>
#include <unistd.h>
struct header
{
char magic[5];
int offset;
int size;
int encoding;
int rate;
int channels;
};
int main()
{
int fin;
int readResult;
fin = open("example_1.au", "w");
int numBytes = read(fin, &readResult, sizeof(int));
printf(readResult);
}
Code: Alles auswählen
fin = open("example_1.au", "w");
https://man7.org/linux/man-pages/man2/open.2.html
"open" erwartet sich den zweiten Parameter als Integer, nicht als String. Vielleicht wolltest du eigentlich "fopen" verwenden?
https://www.proggen.org/doku.php?id=c:tutorial:files
"w" steht weiters für "write", du willst aber aus der Datei lesen. Das heißt du bräuchtest im Fall von "open" eigentlich "O_RDONLY" (als Integer, nicht als String!) bzw. im Fall von "fopen" solltest du "rb" (für "read-binary") verwenden.
Also z.B.:
Code: Alles auswählen
fin = open("example_1.au", O_RDONLY);
Code: Alles auswählen
FILE *file = fopen("example_1.au", "rb");
Re: .au File einlesen und verarbeiten
Ich habe nun folgendes, allerdings werden nur die ersten zwei Header Werte der Datei richtig ausgelesen:
Komme einfach nicht weiter. Danke
LG
Code: Alles auswählen
#include <stdio.h>
#include <stdint.h>
#include "netinet/in.h"
#include <fcntl.h>
#include <unistd.h>
typedef uint32_t uint32; // unsigned int
typedef uint8_t uint8; // unsigned char
uint32 reverseEndianess(uint32 value)
{
uint32 result;
uint8 *bytes = &value;
uint8 *reversed = &result;
reversed[0] = bytes[3];
reversed[1] = bytes[2];
reversed[2] = bytes[1];
reversed[3] = bytes[0];
printf("%d\n", result);
return result;
}
int main(int argc, char** argv)
{
if (argc == 1)
{
printf("Error: provide at least one file name. Example:\n");
printf("%s file1.au\n", argv[0]);
return 1;
}
int why;
int fields[5];
int file;
int i, j;
for (i = 1; i < argc; ++i)
{
printf("File: %s\n", argv[i]);
file = open(argv[i], O_RDONLY);
read(file, &magic, sizeof(int));
why= reverseEndianess(why);
read(file, &fields, sizeof(int));
for (j = 0; j < 5; ++j)
fields[j] = reverseEndianess(fields[j]);
printf(" magic = %x\n", magic);
printf(" offset = %d\n", fields[0]);
printf(" size = %d\n", fields[1]);
printf(" encoding = %d\n", fields[2]);
printf(" sample rate = %d\n", fields[3]);
printf(" channels = %d\n", fields[4]);
close(au_file);
}
return 0;
}
LG
Re: .au File einlesen und verarbeiten
Da du ein Array übergibst, brauchst du hier keinen Adressoperator ("&"). Außerdem liest du nur "sizeof(int)" Bytes. Soweit ich deinen Code verstanden habe, möchtest du aber 5 Werte mit einer Größe von jeweils "sizeof(int)" lesen.xycode hat geschrieben: ↑Mo Okt 11, 2021 9:05 pmCode: Alles auswählen
read(file, &fields, sizeof(int));
Re: .au File einlesen und verarbeiten
Danke,
das funktioniert jetzt.
Ich möchte das gleiche File nun von hinten nach vorne abspielen. Also ein neues File erstellen, das den Sound von hinten nach vorne abspielt.
Wie funktioniert das?
das funktioniert jetzt.
Ich möchte das gleiche File nun von hinten nach vorne abspielen. Also ein neues File erstellen, das den Sound von hinten nach vorne abspielt.
Wie funktioniert das?
Re: .au File einlesen und verarbeiten
Ohne das Dateiformat zu kennen, würde ich sagen, dass du den gleichen Header schreiben musst und danach die Samples in umgekehrter Reihenfolge.
Der Ablauf ist relativ ähnlich:
* Datei öffnen mit Modus "O_WRONLY"
* Schreiben mit "write"
* Datei schließen

Ich nehme an den Header kannst du inzwischen lesen? Hast du auch schon die Samples erfolgreich geladen?
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: .au File einlesen und verarbeiten
Ich werf mal zur allgemeinen Unterhaltung die Formatbeschreibung mit rein:
Au-Dateiformat
Au-Dateiformat
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.