Я пробовал и libfdk_aac, и aac, но закодированный звук PCM всегда имеет переменную скорость передачи данных. Почему это происходит? Как я могу заставить его кодировать с постоянной скоростью передачи данных?
Код выглядит следующим образом:
#include
#include
#include
extern "C"
{
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
}
int main(int argc, char** argv) {
AVCodecContext* codec_context = NULL;
const AVCodec* codec = NULL;
AVFrame* frame = NULL;
AVPacket* pkt = NULL;
FILE* input_file = NULL;
FILE* output_file = NULL;
int ret;
// Open input file
const char* input_filename = "D:\\audio\\b.pcm";
const char* output_filename = "D:\\audio\\input.aac";
input_file = fopen(input_filename, "rb");
output_file = fopen(output_filename, "wb");
if (!input_file || !output_file) {
fprintf(stderr, "Could not open input or output file\n");
exit(1);
}
// Find the AAC encoder
codec = avcodec_find_encoder_by_name("libfdk_aac");
if (!codec) {
fprintf(stderr, "Codec not found\n");
exit(1);
}
codec_context = avcodec_alloc_context3(codec);
if (!codec_context) {
fprintf(stderr, "Could not allocate audio codec context\n");
exit(1);
}
// Set codec parameters
codec_context->sample_fmt = AV_SAMPLE_FMT_S16;
codec_context->sample_rate = 44100;
codec_context->bit_rate = 256000;
codec_context->rc_buffer_size = codec_context->bit_rate;
codec_context->rc_min_rate = codec_context->bit_rate;
codec_context->rc_max_rate = codec_context->bit_rate;
av_channel_layout_default(&codec_context->ch_layout, 2);
// Open codec
if (avcodec_open2(codec_context, codec, &opts) < 0) {
fprintf(stderr, "Could not open codec\n");
exit(1);
}
// Initialize packet
pkt = av_packet_alloc();
if (!pkt) {
fprintf(stderr, "Could not allocate AVPacket\n");
exit(1);
}
// Initialize frame
frame = av_frame_alloc();
frame->nb_samples = codec_context->frame_size;
frame->format = codec_context->sample_fmt;
frame->ch_layout.nb_channels = 2;
// Allocate the data buffers
ret = av_frame_get_buffer(frame, 0);
if (ret < 0) {
fprintf(stderr, "Could not allocate audio data buffers\n");
exit(1);
}
// Main loop: read from the input file, encode, write to the output file
while (fread(frame->data[0], 1, frame->linesize[0], input_file) == frame->linesize[0]) {
// Send the frame to the encoder
if (avcodec_send_frame(codec_context, frame) < 0) {
fprintf(stderr, "Error sending frame to codec\n");
exit(1);
}
// Get the encoded packet
while (avcodec_receive_packet(codec_context, pkt) == 0) {
fwrite(pkt->data, 1, pkt->size, output_file);
av_packet_unref(pkt);
}
}
// Flush the encoder
avcodec_send_frame(codec_context, NULL);
while (avcodec_receive_packet(codec_context, pkt) == 0) {
fwrite(pkt->data, 1, pkt->size, output_file);
av_packet_unref(pkt);
}
// Clean up
fclose(input_file);
fclose(output_file);
av_frame_free(&frame);
av_packet_free(&pkt);
avcodec_free_context(&codec_context);
return 0;
}
Я закодировал AAC, а затем использовал FFmpeg для записи его в файл MP4: ./ffmpeg -i input.aac -c copy output.mp4 и проверил его с помощью MediaInfo
p>
Файл PCM S16, 2 канала, 44100 Гц
Я пробовал и libfdk_aac, и aac, но закодированный звук PCM всегда имеет переменную скорость передачи данных. Почему это происходит? Как я могу заставить его кодировать с постоянной скоростью передачи данных? Код выглядит следующим образом: [code]#include #include #include extern "C" { #include #include #include #include #include #include #include #include #include #include #include #include }
// Allocate the data buffers ret = av_frame_get_buffer(frame, 0); if (ret < 0) { fprintf(stderr, "Could not allocate audio data buffers\n"); exit(1); }
// Main loop: read from the input file, encode, write to the output file while (fread(frame->data[0], 1, frame->linesize[0], input_file) == frame->linesize[0]) { // Send the frame to the encoder if (avcodec_send_frame(codec_context, frame) < 0) { fprintf(stderr, "Error sending frame to codec\n"); exit(1); }
// Get the encoded packet while (avcodec_receive_packet(codec_context, pkt) == 0) { fwrite(pkt->data, 1, pkt->size, output_file); av_packet_unref(pkt); } }
// Flush the encoder avcodec_send_frame(codec_context, NULL); while (avcodec_receive_packet(codec_context, pkt) == 0) { fwrite(pkt->data, 1, pkt->size, output_file); av_packet_unref(pkt); }
// Clean up fclose(input_file); fclose(output_file); av_frame_free(&frame); av_packet_free(&pkt); avcodec_free_context(&codec_context);
return 0; }
[/code] Я закодировал AAC, а затем использовал FFmpeg для записи его в файл MP4: ./ffmpeg -i input.aac -c copy output.mp4 и проверил его с помощью MediaInfo p> Файл PCM S16, 2 канала, 44100 Гц