⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 音频编码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *      Command line frontend program * *      Copyright (c) 1999 Mark Taylor *                    2000 Takehiro TOMIANGA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* $Id: main.c,v 1.92 2005/03/13 14:42:21 robert Exp $ */#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <assert.h>#include <stdio.h>#ifdef STDC_HEADERS# include <stdlib.h># include <string.h>#else# ifndef HAVE_STRCHR#  define strchr index#  define strrchr rindex# endifchar   *strchr(), *strrchr();# ifndef HAVE_MEMCPY#  define memcpy(d, s, n) bcopy ((s), (d), (n))#  define memmove(d, s, n) bcopy ((s), (d), (n))# endif#endif#ifdef HAVE_FCNTL_H# include <fcntl.h>#endif#ifdef __sun__/* woraround for SunOS 4.x, it has SEEK_* defined here */#include <unistd.h>#endif#if defined(_WIN32)# include <windows.h>#endif/* main.c is example code for how to use libmp3lame.a.  To use this library, you only need the library and lame.h.  All other .h files are private to the library.*/#include "lame.h"#include "brhist.h"#include "parse.h"#include "main.h"#include "get_audio.h"#include "portableio.h"#include "timestatus.h"/* PLL 14/04/2000 */#if macintosh#include <console.h>#endif#ifdef WITH_DMALLOC#include <dmalloc.h>#endif/************************************************************************** main** PURPOSE:  MPEG-1,2 Layer III encoder with GPSYCHO* psychoacoustic model.*************************************************************************/intparse_args_from_string(lame_global_flags * const gfp, const char *p,                       char *inPath, char *outPath){                       /* Quick & very Dirty */    char   *q;    char   *f;    char   *r[128];    int     c = 0;    int     ret;    if (p == NULL || *p == '\0')        return 0;    f = q = malloc(strlen(p) + 1);    strcpy(q, p);    r[c++] = "lhama";    while (1) {        r[c++] = q;        while (*q != ' ' && *q != '\0')            q++;        if (*q == '\0')            break;        *q++ = '\0';    }    r[c] = NULL;    ret = parse_args(gfp, c, r, inPath, outPath, NULL, NULL);    free(f);    return ret;}FILE   *init_files(lame_global_flags * gf, char *inPath, char *outPath){    FILE   *outf;    /* Mostly it is not useful to use the same input and output name.       This test is very easy and buggy and don't recognize different names       assigning the same file     */    if (0 != strcmp("-", outPath) && 0 == strcmp(inPath, outPath)) {        fprintf(stderr, "Input file and Output file are the same. Abort.\n");        return NULL;    }    /* open the wav/aiff/raw pcm or mp3 input file.  This call will     * open the file, try to parse the headers and     * set gf.samplerate, gf.num_channels, gf.num_samples.     * if you want to do your own file input, skip this call and set     * samplerate, num_channels and num_samples yourself.     */    init_infile(gf, inPath);    if ((outf = init_outfile(outPath, lame_get_decode_only(gf))) == NULL) {        fprintf(stderr, "Can't init outfile '%s'\n", outPath);        return NULL;    }    return outf;}/* the simple lame decoder *//* After calling lame_init(), lame_init_params() and * init_infile(), call this routine to read the input MP3 file * and output .wav data to the specified file pointer*//* lame_decoder will ignore the first 528 samples, since these samples * represent the mpglib delay (and are all 0).  skip = number of additional * samples to skip, to (for example) compensate for the encoder delay */intlame_decoder(lame_global_flags * gfp, FILE * outf, int skip, char *inPath,             char *outPath){    short int Buffer[2][1152];    int     iread;    double  wavsize;    int     i;    void    (*WriteFunction) (FILE * fp, char *p, int n);    int tmp_num_channels = lame_get_num_channels( gfp );    if (silent < 10) fprintf(stderr, "\rinput:  %s%s(%g kHz, %i channel%s, ",            strcmp(inPath, "-") ? inPath : "<stdin>",            strlen(inPath) > 26 ? "\n\t" : "  ",            lame_get_in_samplerate( gfp ) / 1.e3,            tmp_num_channels, tmp_num_channels != 1 ? "s" : "");    switch (input_format) {    case sf_mp3:        if (skip==0) {            if (enc_delay>-1) skip = enc_delay + 528+1;            else skip=lame_get_encoder_delay(gfp)+528+1;        }else{            /* user specified a value of skip. just add for decoder */            skip += 528+1; /* mp3 decoder has a 528 sample delay, plus user supplied "skip" */        }        if (silent < 10) fprintf(stderr, "MPEG-%u%s Layer %s", 2 - lame_get_version(gfp),                lame_get_out_samplerate( gfp ) < 16000 ? ".5" : "", "III");        break;    case sf_mp2:        skip += 240 + 1;        if (silent < 10) fprintf(stderr, "MPEG-%u%s Layer %s", 2 - lame_get_version(gfp),                lame_get_out_samplerate( gfp ) < 16000 ? ".5" : "", "II");        break;    case sf_mp1:        skip += 240 + 1;        if (silent < 10) fprintf(stderr, "MPEG-%u%s Layer %s", 2 - lame_get_version(gfp),                lame_get_out_samplerate( gfp ) < 16000 ? ".5" : "", "I");        break;    case sf_raw:        if (silent < 10) fprintf(stderr, "raw PCM data");        mp3input_data.nsamp = lame_get_num_samples( gfp );        mp3input_data.framesize = 1152;        skip = 0;       /* other formats have no delay *//* is += 0 not better ??? */        break;    case sf_wave:        if (silent < 10) fprintf(stderr, "Microsoft WAVE");        mp3input_data.nsamp = lame_get_num_samples( gfp );        mp3input_data.framesize = 1152;        skip = 0;       /* other formats have no delay *//* is += 0 not better ??? */        break;    case sf_aiff:        if (silent < 10) fprintf(stderr, "SGI/Apple AIFF");        mp3input_data.nsamp = lame_get_num_samples( gfp );        mp3input_data.framesize = 1152;        skip = 0;       /* other formats have no delay *//* is += 0 not better ??? */        break;    default:        if (silent < 10) fprintf(stderr, "unknown");        mp3input_data.nsamp = lame_get_num_samples( gfp );        mp3input_data.framesize = 1152;        skip = 0;       /* other formats have no delay *//* is += 0 not better ??? */        assert(0);        break;    }    if (silent < 10) {	fprintf(stderr, ")\noutput: %s%s(16 bit, Microsoft WAVE)\n",		strcmp(outPath, "-") ? outPath : "<stdout>",		strlen(outPath) > 45 ? "\n\t" : "  ");	if (skip > 0)	    fprintf(stderr,		    "skipping initial %i samples (encoder+decoder delay)\n",		    skip);    }    if ( 0 == disable_wav_header )        WriteWaveHeader(outf, 0x7FFFFFFF, lame_get_in_samplerate( gfp ),                        tmp_num_channels,                        16);    /* unknown size, so write maximum 32 bit signed value */    wavsize = -skip;    WriteFunction = swapbytes ? WriteBytesSwapped : WriteBytes;    mp3input_data.totalframes = mp3input_data.nsamp / mp3input_data.framesize;    assert(tmp_num_channels >= 1 && tmp_num_channels <= 2);    do {        iread = get_audio16(gfp, Buffer); /* read in 'iread' samples */        mp3input_data.framenum += iread / mp3input_data.framesize;        wavsize += iread;        if (silent <= 0)            decoder_progress(gfp, &mp3input_data);        skip -= (i = skip < iread ? skip : iread); /* 'i' samples are to skip in this frame */        for (; i < iread; i++) {            if ( disable_wav_header ) {                WriteFunction(outf, (char *) &Buffer[0][i], sizeof(short));                if (tmp_num_channels == 2)                    WriteFunction(outf, (char *) &Buffer[1][i], sizeof(short));            }            else {                Write16BitsLowHigh(outf, Buffer[0][i]);                if (tmp_num_channels == 2)                    Write16BitsLowHigh(outf, Buffer[1][i]);            }        }    } while (iread);    i = (16 / 8) * tmp_num_channels;    assert(i > 0);    if (wavsize <= 0) {        if (silent < 10) fprintf(stderr, "WAVE file contains 0 PCM samples\n");        wavsize = 0;    }    else if (wavsize > 0xFFFFFFD0 / i) {        if (silent < 10) fprintf(stderr,                "Very huge WAVE file, can't set filesize accordingly\n");        wavsize = 0xFFFFFFD0;    }    else {        wavsize *= i;    }    if ( 0 == disable_wav_header )        if (!fseek(outf, 0l, SEEK_SET)) /* if outf is seekable, rewind and adjust length */            WriteWaveHeader(outf, (int)wavsize, lame_get_in_samplerate( gfp ),                            tmp_num_channels, 16);    fclose(outf);    if (silent <= 0)	decoder_progress_finish(gfp);    return 0;}intlame_encoder(lame_global_flags * gf, FILE * outf, int nogap, char *inPath,             char *outPath){    unsigned char mp3buffer[LAME_MAXMP3BUFFER];    int     Buffer[2][1152];    int     iread, imp3;    static const char *mode_names[2][4] = {        {"stereo", "j-stereo", "dual-ch", "single-ch"},        {"stereo", "force-ms", "dual-ch", "single-ch"}    };    int     frames;    if (silent < 10) {        lame_print_config(gf); /* print useful information about options being used */        fprintf(stderr, "Encoding %s%s to %s\n",                strcmp(inPath, "-") ? inPath : "<stdin>",                strlen(inPath) + strlen(outPath) < 66 ? "" : "\n     ",                strcmp(outPath, "-") ? outPath : "<stdout>");        fprintf(stderr,                "Encoding as %g kHz ", 1.e-3 * lame_get_out_samplerate(gf));	{            const char *appendix = "";            switch (lame_get_VBR(gf)) {            case vbr_mt:            case vbr_rh:            case vbr_mtrh:                appendix = "ca. ";                fprintf(stderr, "VBR(q=%i)", lame_get_VBR_q(gf));                break;            case vbr_abr:                fprintf(stderr, "average %d kbps",                        lame_get_VBR_mean_bitrate_kbps(gf));                break;            default:                fprintf(stderr, "%3d kbps", lame_get_brate(gf));                break;            }            fprintf(stderr, " %s MPEG-%u%s Layer III (%s%gx) qval=%i\n",                    mode_names[lame_get_force_ms(gf)][lame_get_mode(gf)],                    2 - lame_get_version(gf),                    lame_get_out_samplerate(gf) < 16000 ? ".5" : "",                    appendix,                    0.1 * (int) (10. * lame_get_compression_ratio(gf) + 0.5),                    lame_get_quality(gf));        }        if (silent <= -10)            lame_print_internals(gf);        fflush(stderr);    }    /* encode until we hit eof */    do {        /* read in 'iread' samples */        iread = get_audio(gf, Buffer);        frames = lame_get_frameNum(gf); /********************** status display  *****************************/        if (silent <= 0) {            if (update_interval > 0) {                timestatus_klemm(gf);            }            else {                if (0 == frames % 50) {#ifdef BRHIST                    brhist_jump_back();#endif                    timestatus(lame_get_out_samplerate(gf),                               frames,                               lame_get_totalframes(gf),                               lame_get_framesize(gf));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -