Извлечение кадров из видео работает некорректноC++

Программы на C++. Форум разработчиков
Anonymous
Извлечение кадров из видео работает некорректно

Сообщение Anonymous »

Используя библиотеки (libav) и (ffmpeg), я пытаюсь извлечь кадры в виде файлов .jpg из файла video.mp4, проблема в том, что моя программа вылетает при использовании CV_8UC3< /code>, но если изменить этот параметр на CV_8UC1, извлеченные изображения останутся без цвета (в оттенках серого), я действительно не знаю, что я пропустил, вот минимальный код для воспроизведения двух ситуаций:< /p>
#include

extern "C"
{
#include
#include
}

int main()
{
AVFormatContext *formatContext = nullptr;

if (avformat_open_input(&formatContext, "video.mp4", nullptr, nullptr) != 0)
{
return -1;
}

if (avformat_find_stream_info(formatContext, nullptr) < 0)
{
return -1;
}

AVPacket packet;
const AVCodec *codec = nullptr;
AVCodecContext *codecContext = nullptr;

int videoStreamIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_VIDEO, -1, -1, &codec, 0);
if (videoStreamIndex < 0)
{
return -1;
}

codecContext = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(codecContext, formatContext->streams[videoStreamIndex]->codecpar);

if (avcodec_open2(codecContext, codec, nullptr) < 0)
{
return -1;
}

AVFrame *frame = av_frame_alloc();

while (av_read_frame(formatContext, &packet) >= 0)
{
if (packet.stream_index == videoStreamIndex)
{
int response = avcodec_send_packet(codecContext, &packet);

if (response < 0)
{
break;
}

while (response >= 0)
{
response = avcodec_receive_frame(codecContext, frame);
if (response == AVERROR(EAGAIN))
{
// NO FRAMES
break;
}

else if (response == AVERROR_EOF)
{
// END OF FILE
break;
}

else if (response < 0)
{
break;
}

//cv::Mat frameMat(frame->height, frame->width, CV_8UC3, frame->data[0]); // CV_8UC3 → THE PROGRAM CRASHES
cv::Mat frameMat(frame->height, frame->width, CV_8UC1, frame->data[0]); // CV_8UC1 → WORK BUT IMAGES ARE IN GRAYSCALE
cv::imwrite("frame_" + std::to_string(frame->pts) + ".jpg", frameMat);
}
}

av_packet_unref(&packet);
}

av_frame_free(&frame);
avcodec_free_context(&codecContext);
avformat_close_input(&formatContext);

return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/783 ... -correctly

Вернуться в «C++»