TinyMp3

main.c

#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <limits.h>
#include "shine_mp3.h"

/**
 * \brief 正弦信號數(shù)據(jù)采集, freq 信號頻率, fs 采樣頻率, vpp 信號幅度
 */
void sample_sin(int16_t *dat, int len, float freq, float fs, float vpp)
{
    static uint32_t i = 0;
 
    const float pi = 3.14159265358979323846f;
 
    int n = fs / freq;
 
    for (uint32_t j = 0; j < len; i++, j++)
    {
        float x = i * 2.0f * pi / n;
        dat[j] = vpp * cosf(x);
        if(i >= n )
        {
            i = 0;
        }
    }
}



/* Print some info about what we're going to encode */
static void check_config(shine_config_t *config) 
{
    static char *version_names[4] = {"2.5", "reserved", "II", "I"};
    static char *mode_names[4] = {"stereo", "joint-stereo", "dual-channel", "mono"};
    static char *demp_names[4] = {"none", "50/15us", "", "CITT"};

    printf("MPEG-%s layer III, %s  Psychoacoustic Model: Shine\n",
           version_names[shine_check_config(config->wave.samplerate, config->mpeg.bitr)],
           mode_names[config->mpeg.mode]);
    printf("Bitrate: %d kbps  ", config->mpeg.bitr);
    printf("De-emphasis: %s   %s %s\n",
           demp_names[config->mpeg.emph],
           ((config->mpeg.original) ? "Original" : ""),
           ((config->mpeg.copyright) ? "(C)" : ""));
    // printf("Encoding \"%s\" to \"%s\"\n", infname, outfname);
}


#define SAMPLE_RATE 48000
#define CHANNELS 1
#define BUF_LEN 48000


int main(int argc, char const *argv[])
{
    shine_config_t config;
    shine_t s;
    int16_t buf[BUF_LEN];

    shine_set_config_mpeg_defaults(&config.mpeg);
    config.mpeg.mode = MONO;
    config.wave.samplerate = SAMPLE_RATE;
    config.wave.channels = CHANNELS;
    
    /* See if samplerate and bitrate are valid */
    if (shine_check_config(config.wave.samplerate, config.mpeg.bitr) < 0)
        printf("Unsupported samplerate/bitrate configuration.\n");

    s = shine_initialise(&config);

    check_config(&config);

    int samples_per_pass = shine_samples_per_pass(s) * CHANNELS;

    printf("samples_per_pass: %d\n", samples_per_pass);
    
    FILE *fp = fopen("test.mp3", "w");

    if(fp == NULL)
        return -1;

    int written;
    uint8_t *data;

    /* 寫入數(shù)據(jù) */
    for (int i = 0; i < 100*4; i++)
    {   
        /* 采樣數(shù)據(jù) */
        sample_sin(buf, samples_per_pass, 1000, SAMPLE_RATE, 10000);

        data = shine_encode_buffer_interleaved(s, buf, &written);
        printf("written %d\n", written);
        if ( fwrite(data, 1, written, fp) != written )
        {
            fprintf(stderr, "shineenc: write error\n");
            return 1;
        }
    }

    /* Flush and write remaining data. */
    data = shine_flush(s, &written);
    fwrite(data, 1, written, fp);
    printf("written %d\n", written);

    /* Close encoder. */
    shine_close(s);

    /* Close the MP3 file */
    fclose(fp);

    return 0;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容