Seite 1 von 1

.au File einlesen und verarbeiten

Verfasst: So Okt 10, 2021 6:19 pm
von xycode
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

Re: .au File einlesen und verarbeiten

Verfasst: Mo Okt 11, 2021 6:51 am
von nufan
Hallo :)

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);

}
Wesentlich ist folgende Zeile:

Code: Alles auswählen

fin = open("example_1.au", "w");
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.:

Code: Alles auswählen

fin = open("example_1.au", O_RDONLY);
Oder:

Code: Alles auswählen

FILE *file = fopen("example_1.au", "rb");

Re: .au File einlesen und verarbeiten

Verfasst: Mo Okt 11, 2021 9:05 pm
von xycode
Ich habe nun folgendes, allerdings werden nur die ersten zwei Header Werte der Datei richtig ausgelesen:

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;
}
Komme einfach nicht weiter. Danke

LG

Re: .au File einlesen und verarbeiten

Verfasst: Mo Okt 11, 2021 9:31 pm
von nufan
xycode hat geschrieben:
Mo Okt 11, 2021 9:05 pm

Code: Alles auswählen

read(file, &fields, sizeof(int));
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.

Re: .au File einlesen und verarbeiten

Verfasst: Di Okt 12, 2021 4:49 pm
von xycode
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?

Re: .au File einlesen und verarbeiten

Verfasst: Di Okt 12, 2021 5:27 pm
von nufan
xycode hat geschrieben:
Di Okt 12, 2021 4:49 pm
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?
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?

Re: .au File einlesen und verarbeiten

Verfasst: Mi Okt 13, 2021 10:27 am
von Xin
Ich werf mal zur allgemeinen Unterhaltung die Formatbeschreibung mit rein:
Au-Dateiformat