Quantcast
Channel: MediaSPIP
Viewing all articles
Browse latest Browse all 118079

Seeking with FFmpeg gives old frames with new packet timestamp

$
0
0

I'm using FFmpeg 2.7 to write a sample application that would do the following:

  1. Read the video packets from the given .mov file
  2. Seek to a specified position after 10 sec of decoded video and continue for another 10 sec
  3. Decode all video packets before and after the seek and write them into a target file.

In the process, I am also dumping all the video frames received into raw image files, using the PTS of the original packet as the filename. I notice that even after the seek has happened (noted by the jump in timestamp), the first few frames after the seek contain the new timestamp, but the old frames (i.e., frames I would have received without seek).

These images illustrate the problem.

The following is a snippet of the code I'm using:

int SeekAndTranscode::_TranscodePacket(AVPacket &packet, AVFrame *frame)
{ if(packet.stream_index == _videoStreamIndex) { int status = avcodec_decode_video2(&_videoDecContext, frame, &gotFrame, &packet); if (status < 0) { fprintf(stderr, "\nError decoding video frame\n"); exit(1); } if (gotFrame) { if (frame->width != _width || frame->height != _height || frame->format != _pixelFormat) { return -1; } vector rgbData; rgbData.resize(_width * _height * 4); uint8_t *rgbSrc[3]= {&rgbData[0], NULL, NULL}; int rgbStride[3]={4 * _width, 0, 0}; sws_scale(_csc, frame->data, frame->linesize, 0, _height, rgbSrc, rgbStride); int64_t pts = packet.pts * AV_TIME_BASE / _videoDecContext.time_base.den; FILE *file; stringstream filename; filename <<"C:\\Bipul\\"<< pts <<".raw"; file = fopen(filename.str().c_str(), "wb"); fwrite(&rgbData[0], 1, rgbData.size(), file); fclose(file); fwrite(&rgbData[0], 1, rgbData.size(), _videoOutputFile); } } return decodedSize;
} void SeekAndTranscode::TranscodeIntoFile()
{ AVFrame* frame = NULL; AVPacket packet; int videoSeeks = 0; int frameCount = 0; int framerate = 24; try { frame = av_frame_alloc(); if (!frame) { fprintf(stderr, "\nCould not allocate frame for decoding\n"); exit(1); } av_init_packet(&packet); packet.data = NULL; packet.size = 0; while (av_read_frame(_formatContext, &packet) >= 0) { if(packet.stream_index == _videoStreamIndex) { frameCount++; if(frameCount % (10*framerate) == 0) { if(videoSeeks == 1) break; av_seek_frame(_formatContext, -1, _seekPosition * AV_TIME_BASE, 0); videoSeeks++; continue; } } AVPacket originalPacket = packet; do { int status = _TranscodePacket(packet, frame); if (status < 0) break; packet.data += status; packet.size -= status; } while (packet.size > 0); av_packet_unref(&originalPacket); } if (frame) { av_frame_free(&frame); } swr_free(&_resampler); } catch(const exception& e) { fprintf(stderr, "\n%s\n", e.what()); exit(1); }
}

Is this a known issue with this version of FFmpeg? Has this been fixed in later versions? Is there something I'm doing wrong? Any leads will be appreciated.

-- These images illustrate the problem.

Viewing all articles
Browse latest Browse all 118079

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>