С помощью хороших людей вроде разобрался с тем как пользоваться 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);
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Функция разрешения входящего соединения через сокет формирует дескриптор нового сокета, возвращая значение типа SOCKET
Я установил IDE NetBeans 82 и теперь стоит задача реализовать в приложении локальную базу
Задача: 1) создать множество cats; 2) в методе createCats() создать 3 кота и присвоить их множеству cats; 3) удалить одного кота из множества cats в методе...