Возможно ли, что PTS определенного кадра в файле отличается от PTS того же кадра в том же файле во время его потоковой передачи?
Когда я читаю кадр с помощью av_read_frame, я сохраняю видеопоток в AVStream. После декодирования кадра с помощью avcodec_decode_video2 я сохраняю отметку времени этого кадра в int64_t, используя av_frame_get_best_effort_timestamp. Теперь, если программа получает входные данные из файла, я получаю метку времени, отличную от того, когда я передаю входные данные (из того же файла) в программу.
Чтобы изменить тип ввода, я просто меняю аргумент argv с «/path/to/file.mp4» на что-то вроде «udp://localhost:1234», затем я передаю файл с помощью ffmpeg в командной строке: «ffmpeg -re -i /путь/к/файлу.mp4 -f mpegts udp://localhost:1234". Может ли это быть из-за того, что аргументы "-f mpegts" изменяют некоторые характеристики носителя?
Ниже мой код (упрощенный). Прочитав архивы списка рассылки ffmpeg, я понял, что time_base, который я ищу, находится в AVStream, а не в AVCodecContext. Вместо использования av_frame_get_best_effort_timestamp я также пытался использовать package.pts, но результаты не меняются. Мне нужны метки времени, чтобы иметь представление о номере кадра в получаемом потоковом видео. Я был бы очень признателен за любую помощь.
//..
//argv[1]="/file.mp4";
argv[1]="udp://localhost:7777";
// define AVFormatContext, AVFrame, etc.
// register av, avcodec, avformat_network_init(), etc.
avformat_open_input(&pFormatCtx, argv, NULL, NULL);
avformat_find_stream_info(pFormatCtx, NULL);
// find the video stream...
// pointer to the codec context...
// open codec...
pFrame=av_frame_alloc();
while(av_read_frame(pFormatCtx, &packet)>=0) {
AVStream *strem = pFormatCtx->streams[videoStream];
if(packet.stream_index==videoStream) {
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
if(frameFinished) {
int64_t perts = av_frame_get_best_effort_timestamp(pFrame);
if (isMyFrame(pFrame)){
cout << perts*av_q2d(strem->time_base) << "\n";
}
}
}
//free allocated space
}
//..