Raj Swami Ответов: 2

Как сделать мои собственные данные mp3 файла


всем привет,
я провел много исследований по структуре файлов mp3. я понял все о mp3-файле, включая то, как он работает ,из каких данных он состоит, как читать данные mp3-файла, как писать данные mp3-файла и т. д. Теперь я пытаюсь сделать свой собственный mp3-файл так же, как я добавляю свои собственные аудиоданные в файл.но после записи файла с моими собственными аудиоданными он не работает, не знаю почему?. я работаю на языке Си.
и, пожалуйста, не предлагайте мне никакой библиотеки, потому что я хочу сделать это с помощью myown.

Что я уже пробовал:

ниже приведен мой код.
#include<stdio.h>
#include<conio.h>
#include<string.h>

void main()
{
   FILE *fp,*pt;
   static unsigned char file_data[10000000],a[3];
   fp=fopen("expmp3file.mp3","wb");
   pt=fopen("tt.mp3","rb");
   int t=0,u=0,v=0,x=0;
   unsigned long i=0,j=0,k=0,curr_fr_siz=0,size_of_id3v2=0;
   unsigned char b=150;
   a[0]=255;
   a[1]=255;
   a[2]=251;
   a[3]=250;
   while(fread(&file_data[i],sizeof(char),1,pt)==1)
   {
       i++;
   }
   i=0;
   t=file_data[6];
   u=file_data[7];
   v=file_data[8];
   x=file_data[9];
   size_of_id3v2=t*2097152+u*16384+v*128+x+10;// Synchronization Safe Integer formula last 10 is for id3v2 tag header
   //printf("%d\n",size_of_id3v2);
   while(i<size_of_id3v2)
   {
      fwrite(&file_data[i],sizeof(file_data[i]),1,fp);// writing id3v tag from a another file
      i++;
   }
   i=0;
 curr_fr_siz=(144*(320*1000)/44100+1);
 //printf("%d",curr_fr_siz);
   while(i<4000)
   {
       while(k<4)
       {
        fwrite(&a[k],sizeof(char),1,fp);//writing frame header
        k++;
       }
       k=0;
       j=0;
       while(j<curr_fr_siz)
       {
         fwrite(&b,sizeof(b),1,fp);//writing audio data
         j++;
       }
       i++;
   }
   fclose(fp);
   fclose(pt);
   getch();

}


прежде всего, я добавил данные тега id3v из другого файла в начале файла. после этого я добавил один за другим 4000 mp3-кадров с моими собственными данными.

jeron1

Извините за избиение мертвой лошади, но если бы вы прошли через это с помощью отладчика, то довольно быстро показали бы вам ошибку.

2 Ответов

Рейтинг:
9

Raj Swami

я отвечаю на свой собственный вопрос.
код приведен ниже.

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

void main()
{
   FILE *fp,*pt,*up;
   static unsigned char file_data[10000000],a[3];
   fp=fopen("mysound.mp3","wb");
   pt=fopen("tt.mp3","rb");
   int t=0,u=0,v=0,x=0;
   unsigned long i=0,j=0,k=0,z=0,y=0,curr_fr_siz=0,size_of_id3v2=0;
   unsigned char c[10],b=50;
   a[0]=255;
   a[1]=251;
   a[2]=226;
   a[3]=68;
   while(fread(&file_data[i],sizeof(char),1,pt)==1)
   {
       i++;
   }
   i=0;
   t=file_data[6];
   u=file_data[7];
   v=file_data[8];
   x=file_data[9];
   size_of_id3v2=t*2097152+u*16384+v*128+x+10;// Synchronization Safe Integer formula last 10 is for id3v2 tag header
   //printf("%d\n",size_of_id3v2);
   while(i<size_of_id3v2)
   {
      fwrite(&file_data[i],sizeof(file_data[i]),1,fp);
      i++;
   }
   i=0;

 curr_fr_siz=(144*(320*1000)/44100)+1;

   while(i<1000)
   {
       while(k<4)
       {
        fwrite(&a[k],sizeof(char),1,fp);//writing header of frame 
        k++;
       }
       k=0;
       j=0;
       while(j<curr_fr_siz-4)
       {
         srand(time(NULL));
         b=z+rand()%(256-z);//random number,z helps to produce different numbers

         fwrite(&b,sizeof(b),1,fp);//writing my own audio data 
       
         j++;
         z++;
         if(z==200)
         {
             z=1;
         }

       }
       i++;
   }
   fclose(fp);
   fclose(pt);
   getch();

}


RedDk

Где-то здесь есть бесконечная петля ... просто чтобы ты знал. Я бы прошел через код, чтобы узнать, где именно, но я опаздываю на очень важное свидание.

Рейтинг:
0

Richard MacCutchan

while(j<curr_fr_siz)
{
  fwrite(&b,sizeof(b),1,fp);//writing audio data
  j++;
}

Этот код записывает одно значение несколько раз, что вы ожидаете от него?


Raj Swami

я ожидаю, что с моими собственными аудиоданными файл должен отлично воспроизводиться в любом аудиоплеере, независимо от того, какой звук он дает.

Richard MacCutchan

Реальность редко соответствует ожиданиям в этой жизни.

Raj Swami

Итак, каково же решение моего вопроса

Richard MacCutchan

Я не знаю. Вам нужно проверить, что каждый байт, который вы записываете в файл, на самом деле представляет некоторую часть звука.

Raj Swami

хорошо, спасибо, но вещь, каждое значение байта представляет собой какую-то часть звука, независимо от того, понимали мы или нет этот звук.

Richard MacCutchan

Думать недостаточно, нужно быть уверенным. Поэтому изучите спецификации MP3, чтобы убедиться, что ваши данные правильно структурированы, и проверьте выходные данные вашей программы, чтобы убедиться, что вы создали их правильно.