у меня задача захватить видео и звук с источника преобразовать его в flv формат и отослать его по RTMP на сайт.
Коды взял с FFMPEG.
с видео работает все нормально, но вот с PTS для аудио пакетов какая та фигня получается:
......
AVPacket pkt;
av_init_packet(&pkt);
......
ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
(short *)audio_buf);
if (ret < 0) {
av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
return;
}
if (ret > 0)
{
audio_size += ret;
pkt.stream_index = ost->index;
pkt.data = audio_out;
pkt.size = ret;
if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
{
pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
}
pkt.flags |= AV_PKT_FLAG_KEY;
.............
av_interleaved_write_frame(s, pkt);
......
После avcodec_encode_audio() значение enc->coded_frame->pts всегда AV_NOPTS_VALUE, т.о. pts для аудио будет вычисляться автоматически в av_interleaved_write_frame(),
что приводит к тому, что pts аудио на порядок убегает от pts для видео, т.е имею рассинхронизацию. Схема вычисления pts для видео аналогична аудио каналу, за исключением,
что использую там avcodec_encode_video и enc->coded_frame->pts там вычисляется кодеком (x264).
Подскажите как правильно вычислить pts для аудио?
ЗЫ. Входящие временные метки для аудио и видео пакетов имею
25.03.12 19:33: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Здравствуйте, Vicul, Вы писали:
V>>с видео работает все нормально, но вот с PTS для аудио пакетов какая та фигня получается:
V>вопрос решен, проблема была в недопонимании, как работает ффмпег
Здравствуйте

Может, вы еще помните, в чем было дело? Думаю над точно такой же проблемой... Спасибо
Здравствуйте, diana, Вы писали:
D>Здравствуйте, Vicul, Вы писали:
V>>>с видео работает все нормально, но вот с PTS для аудио пакетов какая та фигня получается:
V>>вопрос решен, проблема была в недопонимании, как работает ффмпег
D>Здравствуйте
Может, вы еще помните, в чем было дело? Думаю над точно такой же проблемой... Спасибо
Там я написал, что проблема в недопонимании ПТС.
Для аудио вычислять не надо, они привязываются к видео фреймам, когда их синхронизируете, поэтому устанавливаете их так
pkt.pts = AV_NOPTS_VALUE;
pkt.dts = AV_NOPTS_VALUE;
Для видео просто тупой счетчик
int FrameNumber = 0;
pkt.dts = FrameNumber;
pkt.pts = FrameNumber++;