mp3の中身

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
パコネコ
記事: 139
登録日時: 14年前
住所: 大阪

mp3の中身

#1

投稿記事 by パコネコ » 14年前

今mp3の解析?してるのですが途中からよくわかりません。
↓を参考に勉強していたのですが・・・
http://www001.upp.so-net.ne.jp/yama-k/c ... cture.html

コード:

#include<stdio.h>
int printf_bit(int z,int bit){
	int a;
	printf(",");
	for(a=0;a<8;a++){
		printf("%d",!(z&1<<7-a)?0:1);
		if(a==bit-1 && a<7)printf("\n,");
		else if(a==3)printf(",");
	}
	return 0;
}

int syncword(long int a){
	if(a==0xfff)printf("同期用(12bitすべて\"1\")の値を収納");
	else printf("エラー");
	printf("\n");
	return 0;
}
int ID(int a){
	if(a==1)printf("ISO/IEC 11172-3(MPEG Audio規格)");
	else printf("エラー");
	printf("\n");
	return 0;
}
int Layer(int a){
	if(a==1)printf("LayerIII(mp3)");
	else printf("エラー");
	printf("\n");
	return 0;
}
int protection_bit(int a){
	if(a==0)printf("エラーチェックあり。16bitのCRCエラーチェックを付加");
	else if(a==1)printf("エラーチャックなし");
	else printf("エラー");
	printf("\n");
	return 0;
}
int bitrate_index(int a){
	switch(a){
		case 0:printf("フリービットレート");break;
		case 1:printf("32kbps");break;
		case 2:printf("40kbps");break;
		case 3:printf("48kbps");break;
		case 4:printf("56kbps");break;
		case 5:printf("64kbps");break;
		case 6:printf("80kbps");break;
		case 7:printf("96kbps");break;
		case 8:printf("112kbps");break;
		case 9:printf("128kbps");break;
		case 10:printf("160kbps");break;
		case 11:printf("192kbps");break;
		case 12:printf("224kbps");break;
		case 13:printf("256kbps");break;
		case 14:printf("320kbps");break;
		default:printf("エラー");
	}
	printf("\n");
	return 0;
}
int sampling_frequency(int a){
	switch(a){
		case 0:printf("44.1kHz");break;
		case 1:printf("48kHz");break;
		case 2:printf("32kHz");break;
		default:printf("エラー");
	}
	printf("\n");
	return 0;
}
int padding_bit(int a){
	switch(a){
		case 0:printf("パディングビットなし");break;
		case 1:printf("パディングビットあり");break;
		default:printf("エラー");
	}
	printf("\n");
	return 0;
}
int mode(int a){
	switch(a){
		case 0:printf("ステレオ");break;
		case 1:printf("ジョイントステレオ");break;
		case 2:printf("デュアルチャンネル");break;
		case 3:printf("モノラル");break;
		default:printf("エラー");
	}
	printf("\n");
	return 0;
}
int mode_extension(int a){
	switch(a){
		case 1:printf("Intensityステレオを適用");break;
		case 2:printf("M/Sステレオを適用");break;
		case 3:printf("IntensityステレオとM/Sステレオを適用");break;
		case 0:printf("どちらも非適用");break;
		default:printf("エラー");
	}
	printf("\n");
	return 0;
}
int copyright(int a){
	switch(a){
		case 0:printf("著作権が保護される");break;
		case 1:printf("著作権なし");break;
		default:printf("エラー");
	}
	printf("\n");
	return 0;
}
int original_copy(int a){
	switch(a){
		case 0:printf("コピー");break;
		case 1:printf("オリジナル");break;
		default:printf("エラー");
	}
	printf("\n");
	return 0;
}
int emphasis(int a){
	switch(a){
		case 0:printf("エンファシスなし");break;
		case 1:printf("50/15us");break;
		case 3:printf("CCITT J.17");break;
		default:printf("エラー");
	}
	printf("\n");
	return 0;
}

int main_data_begin(int a){
	printf("%dByte\n",a);
}
int main(void){
	int i,j;
	int a,b,c;
	FILE *fp;
	fp=fopen("C:\\~省略~\\参考資料\\音楽ファイル\\夕陽も沈む.mp3","rb");
	for(i=0;i<3;i++)printf("%c",getc(fp));
	printf("\n");
	for(i=0;i<7;i++){
		printf_bit(getc(fp),8);
		printf("\n");
	}
	printf("\n");
//ヘッダ
	a=getc(fp);
	b=getc(fp);
	syncword(a<<4|b>>4);
	ID(b&8>>3);
	Layer((b>>1)&3);
	protection_bit(b&1);

	printf("\n");
	a=getc(fp);
	bitrate_index(a>>4);
	sampling_frequency(a&3);
	padding_bit(a&1);

	a=getc(fp);
	mode(a>>6);
	mode_extension(a&0x3f>>6);
	copyright(a&8>>3);
	original_copy(a&4>>2);
	emphasis(a&3);
//ここからオーディオデータ
	printf("\n");
	//ここからわからない
	a=getc(fp);
	b=getc(fp);
	main_data_begin((a<<1)|(b>>7));

	fclose(fp);
	return 0;
}
最後のほうからいまいちわかりません。
オーディオデータというところらしいのですが・・・
そのサイトでは続くとなってますし・・・
その続きを解説しているサイト知りませんか?
(ここで教えていただけても、うれしいのですが・・・まださきが長そうなので。)

オーディオデータからが音楽に関係するとは思うのですが・・・
====
Gu-daraさんの
夕陽も沈む.mp3
を使わせていただいてます。
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: mp3の中身

#2

投稿記事 by softya(ソフト屋) » 14年前

そこから先は本当にmp3のオーディオ圧縮データだと思いますが自力で解析というかデコードしたいのでしょうか?
ハフマン符号の復号、逆量子化などかなり複雑なことをしないともとに戻せません。

参考。
hhttp://www.ctrl.nara-k.ac.jp/~idlab/2004member/koba/mp3.doc
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ぬっち
記事: 105
登録日時: 14年前
連絡を取る:

Re: mp3の中身

#3

投稿記事 by ぬっち » 14年前

私も以前から、mp3の解析には興味があって調べてたんですが、サンプルがMPEGLAYER3WAVEFORMAT構造体を利用した再生方法ばかりで、オーディオ部分を解析している人は行かなかったんですよね^^;
( 例 : http://shakuroshusaku.blog44.fc2.com/blog-entry-62.html )

再生するだけなら、このようなものを使ってもいいとは思いますが、自力で解析しようとすると大変そうですね。。。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: mp3の中身

#4

投稿記事 by softya(ソフト屋) » 14年前

ファイルフォーマットの詳細ではないですが、C++とCのデコーダのソースコードがあります。
http://www.wotsit.org/list.asp?page=2&fc=&search=&al=M
このサイトはサンプルコードやフォーマット資料が集められているので色々役立ちますよ。
参考にしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
パコネコ
記事: 139
登録日時: 14年前
住所: 大阪

Re: mp3の中身

#5

投稿記事 by パコネコ » 14年前

ぬっちさん・ソフト屋さん
ありがとうございました。
おかげで1つわかったことがあります。
つまり難しいということですね。

まる1日経過しましたしこの辺で解決にしておきます。
ですが、いいとこ見つけたよ。という方がいましたら書き込んでおいていただけると嬉しいです。

http://coconut.sys.eng.shizuoka.ac.jp/bmp/#structure
↑はbmpの解析ですが、このような形で紹介されてるサイトが私には理想です。
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: mp3の中身

#6

投稿記事 by softya(ソフト屋) » 14年前

少なくともmp3の規格書(英語)はISO/IEC 11172-3として有料で入手は可能です。
http://www.iso.org/iso/catalogue_detail ... mber=22412
特許とかの絡み物あり、インターネット上には詳細な資料が英語も含めて存在しません。
なのでソースコードが一番の資料だと思います。

あとハフマン符号化などによりビットストリームのデータに成っているので固定長のフォーマットと違い構造体などで書き表せないフォーマットなのもあると思います。
「データ圧縮法概説 第3章-2」
http://www.snap-tck.com/room03/c02/comp/comp032.html

【追記】
気になったので調べてみました。
卒業論文につっこんだ話題が多いので、卒業論文だけを抽出しています。
参考にしてください。
http://labo.nshimizu.com/thesis/b2009/6adf1118.pdf
http://shimizu-lab.dt.u-tokai.ac.jp/the ... et3113.pdf
http://shimizu-lab.dt.u-tokai.ac.jp/the ... epm054.pdf
http://shimizu-lab.dt.u-tokai.ac.jp/the ... et3117.pdf
http://shimizu-lab.dt.u-tokai.ac.jp/the ... dt2301.pdf
ほとんど同じ大学。でも年度は違う・・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る