FFMPEG медленно записывает в файл

104
06 декабря 2019, 19:00

С помощью хороших людей вроде разобрался с тем как пользоваться ffmpeg для encode. Возникла следующая проблема, при записи в файл данных с микрофона при sample_rate = 480000; у меня свой голос (не измененный чистотно) но запись идет как будто в слоу мо. А при sample_rate = 96000; скорость в порядке но я имею робовойс соответственно.Ниже приведу гавлыне функции создания всех объектов которые работают для создания и определения.

    int AudioFileWriter::initAudio(int *sampleFormat, int *sampleRate, int64_t bitrate, int64_t chanellLayout)
    {
        AVCodecID codecId = fmt_ctx->oformat->audio_codec;
        if( codecId == AV_CODEC_ID_NONE )
            return -1;
        Param& p = _audioParam;
        p.codec = avcodec_find_encoder(codecId);
        if(!p.codec)
            return -1;
        p.stream = avformat_new_stream(fmt_ctx,p.codec);
        if (!p.stream)
            return -1;
        p.stream->id = fmt_ctx ->nb_streams -1;
        p.codec_ctx = avcodec_alloc_context3(p.codec);
        if ( !p.codec_ctx)
            return -1;
        p.codec_ctx->bit_rate = bitrate;
        p.codec_ctx->sample_fmt = static_cast<AVSampleFormat>(*sampleFormat);
        if ( p.codec->sample_fmts )
        {
            p.codec_ctx->sample_rate = p.codec->sample_fmts[0];
            for( int i = 0; p.codec->sample_fmts[i]; i++ )
                if( p.codec->sample_fmts[i] == *sampleFormat )
                {
                    p.codec_ctx->sample_fmt = static_cast<AVSampleFormat>(*sampleFormat);
                    break;
                }
        }
        p.codec_ctx->sample_rate = *sampleRate;
        if( p.codec->supported_samplerates )
        {
            p.codec_ctx->sample_rate = p.codec->supported_samplerates[0];
            for ( int i = 0; p.codec->supported_samplerates[i]; i++ )
            {
                if( p.codec->supported_samplerates[i] == *sampleRate )
                {
                    p.codec_ctx->sample_rate = *sampleRate;
                }
            }
        }
        *sampleRate = p.codec_ctx->sample_rate;
        p.codec_ctx->channel_layout = chanellLayout;
        p.codec_ctx->channels = av_get_channel_layout_nb_channels( p.codec_ctx->channel_layout );
        p.stream->time_base = { 1, *sampleRate };
        if ( fmt_ctx->oformat->flags &AVFMT_GLOBALHEADER )
            p.codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
        frame = av_frame_alloc();
        if(!frame)
            std::cerr << "error alloc frame" << std::endl;
        frame->format = AV_SAMPLE_FMT_S16;
        frame->pts = pts++;
        frame->sample_rate = 48000;
        frame->nb_samples = 1024;//p.codec_ctx->frame_size;//1024
        frame->channel_layout = 4;//p.codec_ctx->channel_layout;
        frame->linesize[0] = 1024*2;//nb_samples * AV_SampleFMT16
        frame->linesize[1] = 1024*2;
        frame->linesize[2] = 1024*2;
        frame->data[0] = new uint8_t[1024];
        frame->data[1] = new uint8_t[1024];
        frame->data[2] = new uint8_t[1024];
        return 0;
}
    int AudioFileWriter::open()
    {
        Param& p = _audioParam;
        int ret = avcodec_open2(p.codec_ctx,p.codec,nullptr);
        if ( ret < 0 )
            return 0;
        ret = avcodec_parameters_from_context(p.stream->codecpar, p.codec_ctx);
        if ( ret < 0 )
            return 0;
        if(!(fmt_ctx->flags & AVFMT_NOFILE))
        {
            ret = avio_open(&fmt_ctx->pb,fmt_ctx->url,AVIO_FLAG_WRITE);
            std::cout << "ret"<<ret << std::endl;
            if ( ret < 0 )
                return ret;
        }
        return avformat_write_header(fmt_ctx,nullptr);
    }
int AudioFileWriter::write(AVFrame *frame)
{
    if ( frame == nullptr )
        return -1;
    Param& p = _audioParam;
    AVCodecContext* contex = p.codec_ctx;
    AVStream* stream = p.stream;
    if(contex && stream)
    {
        AVPacket pkt;
        av_init_packet(&pkt);
        int ret = encode( contex,frame,&pkt );
        if ( ret != 0 )
            return ret;
        av_packet_rescale_ts(&pkt,contex->time_base,stream->time_base);
        pkt.stream_index = stream ->index;
        fmt_ctx->bit_rate = 550000;
        ret = av_interleaved_write_frame(fmt_ctx,&pkt);
        av_packet_unref(&pkt);
        return ret;
    }
    return -1;
    }

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

Использую объект класса следующим образом:

AudioFileWriter* wrt = new AudioFileWriter();
wrt->start("file.wav");
int sampleFormat = AV_SAMPLE_FMT_S16;
int sampleRate   = 48000;
int bitrate = 1000;
int layout  = 4;
wrt->initAudio(&sampleFormat,
              &sampleRate,
              bitrate,
              layout);
READ ALSO
WinSock2 - функция accept()

WinSock2 - функция accept()

Функция разрешения входящего соединения через сокет формирует дескриптор нового сокета, возвращая значение типа SOCKET

127
Как изменить размер JButton в Java

Как изменить размер JButton в Java

что делать? Я попробовал все методы/ или же большую часть

121
Как подключить локальную базу данных в NetBeans 8.2

Как подключить локальную базу данных в NetBeans 8.2

Я установил IDE NetBeans 82 и теперь стоит задача реализовать в приложении локальную базу

130
iterator().next()

iterator().next()

Задача: 1) создать множество cats; 2) в методе createCats() создать 3 кота и присвоить их множеству cats; 3) удалить одного кота из множества cats в методе...

144