#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); ff::Stream& vStream = input.videoStream(); ff::Codec& vDecoder = vStream.codec(); ff::Stream& outVStream = output.addVideoStream(AV_CODEC_ID_PNG, vDecoder.width(), vDecoder.height(), vStream.timeBase(), AV_PIX_FMT_RGB24); ff::Codec& 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; }