PTS:Presentation Time Штамп. PTS в основном используется для измерения времени отображения декодированного видеокадра.
DTS:Decode Time Штамп. DTS главным образом определяет, когда битовый поток, считанный в память, начинает отправляться в декодер для декодирования.
То есть pts отражает момент, когда кадр начинает отображаться, а dts — когда поток данных начинает декодироваться.
Как вы понимаете здесь «когда»? Если есть определенный кадр, предположим, что он начинает отображаться с 10-й секунды. Так какие у него баллы? Это 10? Или 10-ки? Или ни того, ни другого.
Чтобы ответить на вопрос индивидуальный,Сначала представим концепцию временной базы в FFmpeg.,То естьtime_base。Его также используют для измерения временииз。
Если разделить 1 секунду на 25 равных частей, то можно понять это как линейку, тогда каждый квадрат представляет 1/25 секунды. Time_base={1, 25} в настоящее время.
Если вы разделите 1 секунду на 90 000 частей, каждый тик будет равен 1/90 000 секунды, а time_base = {1, 90 000} в это время.
Значение ptsiz — это то, сколько индивидуальных временных масштабов он занимает (сколько индивидуальных сеток он занимает).этоиз Единица измерения не секунды,Но масштаб времени. Толькоhapts плюс time_base используются одновременно.,Чтобы выразить, сколько времени это занимает.
Например, я вам лишь сообщаю, что длина определенного предмета занимает 20 делений на определенной линейке. Но если я не скажу вам, сколько всего сантиметров линейка, вы не сможете посчитать, сколько сантиметров каждая шкала, и не сможете узнать длину предмета.
баллы = 20 тиков time_base={1,10} Каждый масштаб составляет 1/10 сантиметра. Значит длина объекта=точки*time_base=20*1/10 см.
В ffmpeg av_q2d(time_base)=сколько секунд длится каждый тик.
На этом этапе вам не составит труда понять, что pts*av_q2d(time_base) — это временная метка отображения кадра.
первый,Различные форматы упаковки,временная база не та. кроме того,Весь индивидуальный процесс перекодирования,Временная база, соответствующая разным изданным состояниям, также противоречива.
В качестве примера возьмем формат упаковки mpegts 25fps (только видео, аудио примерно одинаковое, но немного другое).
Для несжатых данных (например, YUV или других) соответствующей структурой в ffmpeg является AVFrame, а ее базой времени является time_base AVCodecContext, AVRational{1,25}.
Базой времени, соответствующей сжатым данным (соответствующая структура — AVPacket), является time_base AVStream, AVRational{1,90000}.
Поскольку статус данных другой и временная база другая, мы должны преобразовать его. Сколько ячеек он занимает в масштабе времени 1/25 и занимает 10 ячеек в масштабе 1/90000? Это конвертация очков.
Рассчитайте временную позицию кадра во всем видео на основе точек: временная метка (секунды) = pts * av_q2d(st->time_base)
Длительность имеет те же единицы измерения, что и точки, а длительность указывает, сколько ячеек занимает длительность текущего кадра. Или чтобы понять, сколько кадров занимает интервал между двумя кадрами, надо понимать единицу измерения.
pts: количество сеток av_q2d(st->time_base): секунды/деление
Рассчитать продолжительность видео: время (секунды) = st->duration * av_q2d(st->time_base)
Внутреннее время ffmpeg и метод преобразования стандартного времени: временная метка внутри ffmpeg = AV_TIME_BASE * время (секунды) AV_TIME_BASE_Q=1/AV_TIME_BASE
av_rescale_q(int64_t a, AVRational bq, AVRational cq) функция
Цель этой функции — вычислить a*bq/cq для настройки временной метки с одной временной базы на другую.
При выполнении преобразования развертки эту функцию следует использовать в первую очередь, поскольку она позволяет избежать ситуаций переполнения.
Функция указывает, сколько она занимает сетки под bq и под cq.
Audio sample_rate: количество выборок в секунду, то есть частота дискретизации, указывающая, сколько точек выборки собирается в секунду. Например, 44100HZ означает сбор 44100 выборок за одну секунду.
То есть время каждой выборки составляет 1/44100 секунды.
AVFrame аудиокадра содержит nb_samples выборок, поэтому время, необходимое для AVFrame, составляет nb_samples раз (1/44100) секунд.
То есть длительность_s=nb_samples раз (1/44100) секунд стандартного времени.
преобразован в AVStream временная база duration=duration_s / av_q2d(st->time_base)。
на основеst->time_base из num Значение обычно равно частоте дискретизации, так duration=nb_samples。
pts=n* duration=n *nb_samples。