.au File einlesen und verarbeiten

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
xycode
Beiträge: 3
Registriert: So Okt 10, 2021 6:15 pm

.au File einlesen und verarbeiten

Beitrag von xycode » So Okt 10, 2021 6:19 pm

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

nufan
Wiki-Moderator
Beiträge: 2538
Registriert: Sa Jul 05, 2008 3:21 pm

Re: .au File einlesen und verarbeiten

Beitrag von nufan » Mo Okt 11, 2021 6:51 am

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

xycode
Beiträge: 3
Registriert: So Okt 10, 2021 6:15 pm

Re: .au File einlesen und verarbeiten

Beitrag von xycode » Mo Okt 11, 2021 9:05 pm

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

nufan
Wiki-Moderator
Beiträge: 2538
Registriert: Sa Jul 05, 2008 3:21 pm

Re: .au File einlesen und verarbeiten

Beitrag von nufan » Mo Okt 11, 2021 9:31 pm

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.

xycode
Beiträge: 3
Registriert: So Okt 10, 2021 6:15 pm

Re: .au File einlesen und verarbeiten

Beitrag von xycode » Di Okt 12, 2021 4:49 pm

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?

nufan
Wiki-Moderator
Beiträge: 2538
Registriert: Sa Jul 05, 2008 3:21 pm

Re: .au File einlesen und verarbeiten

Beitrag von nufan » Di Okt 12, 2021 5:27 pm

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?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8764
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: .au File einlesen und verarbeiten

Beitrag von Xin » Mi Okt 13, 2021 10:27 am

Ich werf mal zur allgemeinen Unterhaltung die Formatbeschreibung mit rein:
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.

Antworten