Jump to content

Home

kotorwav2mp3


Recommended Posts

kotorwav2mp3 v1.1 (12.74 kB)

v1.1 is a complete rewrite of the first version.

This package still includes old versions of analyze.exe and bincut.exe as I didn't have the time to rewrite them.

Includes source code for kotorwav2mp3.

 

kotorwav2mp3.exe

Scans file for MP3 sync byte and copies everything after the first sync byte to new file

Usage: kotorwav2mp3 input [input2] [input3] [...]

To convert all WAV files in a folder you can use kotorwav2mp3 *.wav

 

 

File still doesn't work after using kotorwav2mp3?

Perhaps it is WAV file with fake MP3 header

With the help of these 2 tools you can cut at chosen offset

 

analyze.exe

Analyzes the first 2048 bytes of file and reports all MP3 sync byte and WAVE header offsets

Usage: analyze input [input2] [input3] [...]

 

 

bincut.exe

Cuts binary file at chosen offset. Use with analyze to cut at WAVE header or MP3 sync byte

Usage: bincut input offset output

 

C:\kotorwav2mp3>analyze al_en_starforge.wav

Analyzing the first 2048 bytes of al_en_starforge.wav

Possible MP3 sync byte found at 0x0

Possible MP3 sync byte found at 0x9C

Possible MP3 sync byte found at 0x139

Possible WAVE header found at 0x1D6

 

C:\kotorwav2mp3>bincut al_en_starforge.wav 0x1d6 new_file.wav

 

 

if you already downloaded the first version then this doesn't offer any new features for you (unless you want the source code)

 

 

Source code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int mp3_sync_byte(unsigned char *, int);

int main (int argc, char *argv[]) {
FILE *inFile, *outFile;
char *inName, *outName, *ext;
size_t size, result;
int c, i, j, sync_byte = -1;
unsigned char *buffer;

printf("kotorwav2mp3 v1.1 written by Tonttu\n\n");
if (argc < 2) {
	printf("Usage: kotorwav2mp3 input [input2] [input3] [...]\n");
	return 0;
}
//Loop through the input files
for (i=1; i<argc; i++) {
	//Read input file
	inName = argv[i];
	inFile = fopen(inName, "rb");
	if (inFile == NULL) {
		printf("%s: File doesn't exist\n", inName);
		continue;
	}
	fseek(inFile, 0, SEEK_END);
	size = ftell(inFile);
	rewind(inFile);
	buffer = malloc(sizeof(unsigned char) * size); //Allocate memory
	result = fread(buffer, 1, size, inFile);
	fclose(inFile);
	if (result != size) {
		free(buffer);
		printf("%s: Reading error\n", inName);
		continue;
	}

	//Get the first MP3 sync byte in input file
	sync_byte = mp3_sync_byte(buffer, size);
	if (sync_byte < 0) {
		free(buffer);
		printf("%s:\n\tNo MP3 sync byte found\n\tSkipping file\n", inName);
		continue;
	}

	//Output filename
	outName = malloc(sizeof(inName) + 4*sizeof(char*));
	strcpy(outName, inName);
	ext = strstr(outName, ".wav");
	if (ext != NULL) {
		strcpy(ext, ".mp3"); //replace .wav with .mp3
	} else {
		strcat(outName, ".mp3"); //append .mp3
	}
	printf("%s:\n\tMP3 sync byte found at 0x%X\n\tWriting output %s\n", inName, sync_byte, outName);

	//Write output
	outFile = fopen(outName, "wb");
	if (outFile != NULL) {
		for(j=sync_byte; j<size; j++) {
			c = buffer[j];
			fputc(c, outFile);
		}
		fclose(outFile);
	} else {
		printf("Can\'t create %s\n", outName);
	}
	free(outName);
	free(buffer);
}

return 0;
}

/*
A Frame sync  				11 (length in bits)
B MPEG audio version (MPEG-1, 2, etc.) 	2
C MPEG layer (Layer I, II, III, etc.) 	2
D Protection (if on, then checksum follows header) 	1
AAAA AAAA AAAB BCCD
1111 1111 1111 1010 = FA = MPEG-1 layer 3
1111 1111 1111 0010 = F2 = MPEG-2 layer 3
1111 1111 1110 0010 = E2 = MPEG-2.5 layer 3

http://www.datavoyage.com/mpgscript/mpeghdr.htm
*/
int mp3_sync_byte (unsigned char *buffer, int size) {
int i, a=0, b=0, sync_byte=-1;

for(i=0; i<size; i++) {
	a = b;
	b = buffer[i];
	if (a == 0xff &&
	   ((b & 0xfe) == 0xfa ||
		(b & 0xfe) == 0xf2 ||
		(b & 0xfe) == 0xe2 ))
	{
		sync_byte = i-1;
		break;
	}
}

return sync_byte;
}

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...