#include "ffcpp/ffcpp.h" #include "ffcpp/MediaFile.h" #include "ffcpp/Scaler.h" namespace ff = ffcpp; size_t KEY_FRAME_TO_SAVE = 0; int main(int argc, char** argv) { ff::init(); ff::MediaFile input(argv[1], ff::Mode::Read); ff::MediaFile output(argv[2], ff::Mode::Write); auto vStream = input.videoStream(); auto vDecoder = vStream->codec(); auto outVStream = output.addVideoStream(AV_CODEC_ID_PNG, vDecoder->width(), vDecoder->height(), vStream->timeBase(), AV_PIX_FMT_RGB24); auto vEncoder = outVStream->codec(); output.writeHeader(); size_t curKeyFrame = 0; ff::Scaler scaler(vDecoder, vEncoder); while(auto packet = input.readPacket()) { AVMediaType packetType = input.packetType(packet); if(packetType == AVMEDIA_TYPE_VIDEO) { auto frame = vDecoder->decode(packet); if(frame->isKeyFrame() && (frame->pts() > 0 || KEY_FRAME_TO_SAVE == 0)) { if(curKeyFrame == KEY_FRAME_TO_SAVE) { frame = scaler.scale(frame); frame->setPictureType(AV_PICTURE_TYPE_NONE); auto encPacket = vEncoder->encode(frame); if(!encPacket) continue; encPacket.setStreamIndex(0); encPacket.rescaleTimestamps(vStream->timeBase(), outVStream->timeBase()); output.writePacket(encPacket); break; } else { ++curKeyFrame; } } } } output.writeTrailer(); return 0; }