视频压缩
这篇文章我们通过FFMPEG的filter通过指定文件的分辨率将文件进行压缩,压缩的流程如下:
1.打开视频文件
2.解复用
3.解码
4.编码
5.复用
代码
1.打开视频文件
//打开输入文件,初始化输入流
int OpenInput(string inputUrl)
{
pktCount = 0;
inputContext = avformat_alloc_context();
lastFrameRealtime = av_gettime();
inputContext->interrupt_callback.callback = interrupt;
int ret = avformat_open_input(&inputContext, inputUrl.c_str(), nullptr, nullptr);
if (ret < 0) {
av_log("",AV_LOG_ERROR," avformat_open_input failed");
goto Error;
}
ret = avformat_find_stream_info(inputContext,nullptr);
if (ret < 0) {
av_log("", AV_LOG_ERROR, " avformat_find_stream_info failed");
goto Error;
}
return ret;
Error:
if (inputContext) {
avformat_close_input(&inputContext);
}
return ret;
}
2.解复用
//从输入流中读取压缩的视频包packet
shared_ptr<AVPacket> ReadPacketFromSource()
{
std::shared_ptr<AVPacket> packet(static_cast<AVPacket*>(av_malloc(sizeof(AVPacket))), [&](AVPacket *p) { av_packet_free(&p); av_freep(&p); });
av_init_packet(packet.get());
int ret = av_read_frame(inputContext, packet.get());
if (ret < 0) {
return nullptr;
}else {
return packet
}
}
3.解码
//初始化解码器并打开它
int InitDecodeCodec(AVCodecID codecId)
{
AVCodec* codec = avcodec_find_decoder(codecId);
if (!codec) {
av_log("", AV_LOG_ERROR, " avformat_find_stream_info failed");
return -1;
}
decoderContext = inputContext->streams[0]->codec;
int ret = avcodec_open2(decoderContext,codec,nullptr);
if (ret < 0) {
av_log("", AV_LOG_ERROR, " avcodec_open2 failed");
goto Error;
}
return ret;
Error:
if (decoderContext) {
avcodec_close(decoderContext);
}
return<