2013-12-12 2 views
1

Я использую длительность пакета для перевода из индекса кадра в pts и обратно, и я хотел бы быть уверенным, что это надежный способ сделать это.Является ли длительность пакета одинаковой для всего потока?

В качестве альтернативы, есть ли лучший способ перевести баллы в индекс рамки и наоборот?

Отрывок показывает мое использование:

bool seekFrame(int64_t frame) 
{ 
    if(frame > container.frameCount) 
     frame = container.frameCount; 

    // Seek to a frame behind the desired frame because nextFrame() will also increment the frame index 
    int64_t seek = pts_cache[frame-1]; // pts_cache is an array of all frame pts values 

    // get the nearest prior keyframe 
    int preceedingKeyframe = av_index_search_timestamp(container.video_st, seek, AVSEEK_FLAG_BACKWARD); 

    // here's where I'm worried that packetDuration isn't a reliable method of translating frame index to 
    // pts value 
    int64_t nearestKeyframePts = preceedingKeyframe * container.packetDuration; 

    avcodec_flush_buffers(container.pCodecCtx); 

    int ret = av_seek_frame(container.pFormatCtx, container.videoStreamIndex, nearestKeyframePts, AVSEEK_FLAG_ANY); 

    if(ret < 0) return false; 

    container.lastPts = nearestKeyframePts; 

    AVFrame *pFrame = NULL; 

    while(nextFrame(pFrame, NULL) && container.lastPts < seek) 
    { 
     ; 
    } 

    container.currentFrame = frame-1; 
    av_free(pFrame); 
    return true; 
} 

ответ

0

Нет, не гарантируется. Он может работать с некоторыми комбинациями кодеков/контейнеров, где частота кадров статична. avi, h264 raw (приложение-b) и yuv4mpeg. Но другие контейнеры, такие как flv, mp4, ts, имеют PTS/DTS (или CTS) для КАЖДОГО кадра. Источником может быть переменная частота кадров, или кадры могут быть сброшены в какой-то момент во время обработки из-за полосы пропускания. Также некоторые кодеки удаляют дубликаты кадров.

Итак, если вы сами не создали файл. Не верьте этому. Нет надежного способа взглянуть на фрейм и узнать его «индекс», кроме начала и начала.

Ваш метод, МОЖЕТ быть достаточно хорошим для большинства файлов.