В настоящее время у меня возникают проблемы с синхронизацией аудио- и видеопотоков.
Это AVCodecContexts, которые я использую:
Для видео:
AVCodec* videoCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264)
AVCodecContext* videoCodecContext = ffmpeg.avcodec_alloc_context3(videoCodec);
videoCodecContext->bit_rate = 400000;
videoCodecContext->width = 1280;
videoCodecContext->height = 720;
videoCodecContext->gop_size = 12;
videoCodecContext->max_b_frames = 1;
videoCodecContext->pix_fmt = videoCodec->pix_fmts[0];
videoCodecContext->codec_id = videoCodec->id;
videoCodecContext->codec_type = videoCodec->type;
videoCodecContext->time_base = new AVRational
{
num = 1,
den = 30
};
Для аудио:
AVCodec* audioCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_AAC)
AVCodecContext* audioCodecContext = ffmpeg.avcodec_alloc_context3(audioCodec);
audioCodecContext->bit_rate = 1280000;
audioCodecContext->sample_rate = 48000;
audioCodecContext->channels = 2;
audioCodecContext->channel_layout = ffmpeg.AV_CH_LAYOUT_STEREO;
audioCodecContext->frame_size = 1024;
audioCodecContext->sample_fmt = audioCodec->sample_fmts[0];
audioCodecContext->profile = ffmpeg.FF_PROFILE_AAC_LOW;
audioCodecContext->codec_id = audioCodec->id;
audioCodecContext->codec_type = audioCodec->type;
При записи видеокадров я устанавливаю положение PTS следующим образом:
outputFrame->pts = frameIndex; // The current index of the image frame being written
Затем я кодирую кадр с помощью avcodec_encode_video2(). После этого я вызываю следующее для установки меток времени:
ffmpeg.av_packet_rescale_ts(&packet, videoCodecContext->time_base, videoStream->time_base);
Это отлично играет.
Однако, когда я делаю то же самое для звука, видео воспроизводится в замедленном режиме, сначала воспроизводится звук, а затем продолжается воспроизведение видео без звука.
Я нигде не могу найти пример того, как установить позиции pts/dts для видео/аудио в файле MP4. Любые примеры помощи были бы замечательными!
Кроме того, я сначала пишу кадры видео, после чего (как только они все записаны) пишу аудио. Я обновил этот вопрос с помощью скорректированных значений, предложенных в комментариях.
Я загрузил тестовое видео, чтобы показать свои результаты здесь: http://www.filedropper.com/test_124