ffconv/examples/ffPreview.cpp

49 lines
1.3 KiB
C++

#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;
}