سؤال

أحاول استخراج رأس MP3 من ملف. هذا مختلف ثم علامات ID3 - رأس MP3 هو المكان الذي توجد معلومات حول إصدار MPEG، ومعدل البت، والتردد، إلخ.

يمكنك رؤية نظرة عامة على هيكل رأس MP3 هنا: http://upload.wikimedia.org/wikipedia/Commons/01/mp3filetructure.svg.

مشكلتي هي، على الرغم من تحميل الملف والآن تلقي صالحة (بقدر ما أعرف) الناتج الثنائي، أنا لا أرى القيم المتوقعة. يجب أن تكون أول 12 بت من ملف MP3 جميعها، لكل Word MP3 Sync. ومع ذلك، فإنني أتلقى شيئا مختلفا عن أول 8 بت وحدها. هذا سوف يقترح مشكلة لي.

كملاحظة جانبية، لدي ملف MP3 صالح يتم إرفاقه عبر FOPEN

// Main function
int main (void)
{
    // Declare variables
    FILE *mp3file;
    char requestedFile[255] = "";
    unsigned long fileLength;

    // Counters
    int i;

    // Tryout
    unsigned char byte; // Read from file
    unsigned char mask = 1; // Bit mask
    unsigned char bits[8];

    // Memory allocation with malloc
    // Ignore this at the moment! Will be used in the future
    //mp3syncword=(unsigned int *)malloc(20000);

    // Let's get the name of the file thats requested
    strcpy(requestedFile,"testmp3.mp3"); // lets hardcode this into here for now

    // Open the file
    mp3file = fopen(requestedFile, "rb"); // open the requested file with mode read, binary
    if (!mp3file){
        printf("Not found!"); // if we can't find the file, notify the user of the problem
    }

    // Let's get some header data from the file
    fseek(mp3file,0,SEEK_SET);
    fread(&byte,sizeof(byte),1,mp3file);

    // Extract the bits
    for (int i = 0; i < sizeof(bits); i++) {
        bits[i] = (byte >> i) & mask;
    }

    // For debug purposes, lets print the received data
    for (int i = 0; i < sizeof(bits); i++) {
        printf("Bit: %d\n",bits[i]);
    }
هل كانت مفيدة؟

المحلول

قد تأتي معلومات ID3 أولا. هي أول 3 أحرف ID3?

نصائح أخرى

يحتل ID3V2 القليل الأول من ملف MP3، إذا كان هناك. سيكون الباينة الثلاثة الأولى من الملف "ID3":

http://www.id3.org/id3v2.4.0- التنظيم

هناك طريقتان للتعامل معها. الأول هو التحقق من وجود علامة ID3، ثم تحليل رأس 10 بايت لحجم العلامة، وتخطي الأمام في أن العديد من البايتات.

تحرير: إذا قمت بتحليل الرأس، فأنت بحاجة إلى التحقق من وجود القليل الرابع في حقل العلامات إلى واحد، إذا كان ذلك، فأنت بحاجة إلى تخطي 10 بايت إضافية للذهاب إلى تذييل الصفحة.

أو يمكنك فقط البحث عن MP3 حتى تضغط على نمط المزامنة. يتم إعداد الطريقة ID3V2، 11 بت واحد على التوالي لا ينبغي أن تحدث، لضمان التوافق مع اللاعبين الذين لا يدعمونه.

fseek(mp3file,1,SEEK_SET);

هل هناك سبب تخطي البايت الأول من الملف؟

يحاول

fseek(mp3file,0,SEEK_SET)

بدلا من

fseek(mp3file,1,SEEK_SET).

تبدأ الملفات في موقع البايت 0.

أعتقد أنك ربما تريد

fseek(mp3file,0,SEEK_SET);

fseek(mp3file,1,SEEK_SET); يجعلك تخطي البتات الثمانية الأولى، إذن ما تحصل عليه مع FREED هي بت 9 إلى 16

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top