Как сделать звук лучше?(Пример генерации аудио C + FFMpeg) - PullRequest
0 голосов
/ 23 июля 2010

Итак, я нашел этот замечательный официальный C FFMpeg пример , который я упростил:

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

#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif

#include "libavcodec/avcodec.h"
#include "libavutil/mathematics.h"

#define INBUF_SIZE 4096
#define AUDIO_INBUF_SIZE 20480
#define AUDIO_REFILL_THRESH 4096

/*
 * Audio encoding example
 */
static void audio_encode_example(const char *filename)
{
    AVCodec *codec;
    AVCodecContext *c= NULL;
    int frame_size, i, j, out_size, outbuf_size;
    FILE *f;
    short *samples;
    float t, tincr;
    uint8_t *outbuf;

    printf("Audio encoding\n");

    /* find the MP2 encoder */
    codec = avcodec_find_encoder(CODEC_ID_MP2);
    if (!codec) {
        fprintf(stderr, "codec not found\n");
        exit(1);
    }

    c= avcodec_alloc_context();

    /* put sample parameters */
    c->bit_rate = 64000;
    c->sample_rate = 44100;
    c->channels = 2;

    /* open it */
    if (avcodec_open(c, codec) < 0) {
        fprintf(stderr, "could not open codec\n");
        exit(1);
    }

    /* the codec gives us the frame size, in samples */
    frame_size = c->frame_size;
    samples = malloc(frame_size * 2 * c->channels);
    outbuf_size = 10000;
    outbuf = malloc(outbuf_size);

    f = fopen(filename, "wb");
    if (!f) {
        fprintf(stderr, "could not open %s\n", filename);
        exit(1);
    }

    /* encode a single tone sound */
    t = 0;
    tincr = 2 * M_PI * 440.0 / c->sample_rate;
    for(i=0;i<200;i++) {
        for(j=0;j<frame_size;j++) {
            samples[2*j] = (int)(sin(t) * 10000);
            samples[2*j+1] = samples[2*j];
            t += tincr;
        }
        /* encode the samples */
        out_size = avcodec_encode_audio(c, outbuf, outbuf_size, samples);
        fwrite(outbuf, 1, out_size, f);
    }
    fclose(f);
    free(outbuf);
    free(samples);

    avcodec_close(c);
    av_free(c);
}

int main(int argc, char **argv)
{

    /* must be called before using avcodec lib */
    avcodec_init();

    /* register all the codecs */
    avcodec_register_all();

    audio_encode_example("test.mp2");

    return 0;
}

Как это должно звучать? Может быть, я чего-то не понимаю, но это звучит ужасно = (как сделать звук генерации звука лучше / интереснее / мелодичнее с осторожным криком (нет специальных функций, просто как изменить этот код, чтобы он звучал лучше) *

Ответы [ 2 ]

1 голос
/ 23 июля 2010

Если я правильно понимаю код, это должен быть чистый тон или восходящий тон (я действительно не уверен). В любом случае это, вероятно, не будет звучать очень хорошо. В природе мы редко слышим чистые синусоидальные тона - они звучат довольно резко и резко. Большинство вещей, которые мы считаем «музыкальными», как правило, состоят из множества разных частот.

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

0 голосов
/ 30 апреля 2013

Этот код должен испускать синусоиду 440 Гц, скорее как тон гобоя, на который настроены симфонические оркестры.

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

...