muslaev.ilya Posted March 4, 2021 Posted March 4, 2021 (edited) Добрый Вечер! уже целый месяц не могу через программирование преобразовать изображении RGB8 после рендер с неподвижной камеры на jpeg. какие пути и способы программировать преобразование с RGB на JPEG? Благодарю Edited March 4, 2021 by muslaev.ilya
silent Posted March 4, 2021 Posted March 4, 2021 muslaev.ilya А можете показать код который у вас сейчас используется? Что значит "RGB8 после рендера"? Спасибо. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
muslaev.ilya Posted March 5, 2021 Author Posted March 5, 2021 (edited) код std::uint8_t* buff_img; buff_img = camControl->getBuffer(1);//получаем адрес из Image Unigine::Image::getPixels() if (buff_img) { AVPicture dst_picture; avpicture_alloc(&dst_picture, AV_PIX_FMT_YUV420P, w2, h2); SwsContext* ctx = sws_getContext( w1, h1, AV_PIX_FMT_RGB32, w2, h2, AV_PIX_FMT_YUV420P, 0, 0, 0, 0); std::uint8_t* inData[1] = { buff_img };// RGB24 have one plane int inLiunesize[1] = { 4 * w1 }; // RGB stride sws_scale(ctx, inData, inLiunesize, 0, w1, dst_picture.data, dst_picture.linesize); std::string bufferJPG; std::uint8_t* pixels = reinterpret_cast<std::uint8_t*>(dst_picture.data[0]); int buf_size = w2 * h2 * 1;// 4;// 3; std::size_t size = buf_size; std::unique_lock<std::mutex> lock(m_Locker); for (int i = 0; i < size; i++) { bufferJPG.push_back(pixels[i]);// на этом место все время вылетает точнее зависает ПО } buffer = httplib::detail::base64_encode(bufferJPG); lock.unlock(); res.set_content(buffer, "image/jpeg"); на консоле выдает но это ошибка касается только библиотека ffmpeg [swscaler @ 0000014ed4dc00c0] Slice parameters 0, 800 are invalid Edited March 5, 2021 by muslaev.ilya
muslaev.ilya Posted March 5, 2021 Author Posted March 5, 2021 или другой код Unigine::ImagePtr m_BufferImg[2]; ...... std::unique_lock<std::mutex> lock(m_Locker); int check = retImagePtr->copy(m_BufferImg[m_bufIdx], 0, 0, 0, 0, m_img_w, m_img_h); lock.unlock(); в консоле выдает Image::copy(): image is not loaded
sweetluna Posted March 5, 2021 Posted March 5, 2021 Я пологаю тип у bufferJPG - std::vector? Попробуйте перед циклом вызвать reserve(buf_size). И что именно происходит тут? for (int i = 0; i < size; i++) { bufferJPG.push_back(pixels[i]);// на этом место все время вылетает точнее зависает ПО } Quote Image::copy(): image is not loaded Это означает, что Image (либо retImagePtr, либо m_BufferImg[m_bufIdx]) не был загружен (нет данных). Используйте create2D. Спасибо. May RenderDoc/Nsight Graphics/Intel GPA bless you
muslaev.ilya Posted March 5, 2021 Author Posted March 5, 2021 1 hour ago, sweetluna said: Я пологаю тип у bufferJPG - std::vector? Попробуйте перед циклом вызвать reserve(buf_size). И что именно происходит тут? for (int i = 0; i < size; i++) { bufferJPG.push_back(pixels[i]);// на этом место все время вылетает точнее зависает ПО } Это означает, что Image (либо retImagePtr, либо m_BufferImg[m_bufIdx]) не был загружен (нет данных). Используйте create2D. Спасибо. bufferJPG это std::string уже инициализирован и создан m_BufferImg[0] = Image::create(); m_BufferImg[1] = Image::create(); m_BufferImg[0]->create2D(w, h, Image::FORMAT_RGBA8); m_BufferImg[1]->create2D(w, h, Image::FORMAT_RGBA8);
muslaev.ilya Posted March 5, 2021 Author Posted March 5, 2021 (edited) проблема в том что std::uint8_t* pixels = reinterpret_cast<std::uint8_t*>(dst_picture.data[0]); адрес получил, а дальше скопировать содержимое pixels[i] на bufferJPG.push_back(); во время работы толи постоянно зависает, то ли выдает на консоле [swscaler @ 0000014ed4dc00c0] Slice parameters 0, 800 are invalid Edited March 5, 2021 by muslaev.ilya
sweetluna Posted March 9, 2021 Posted March 9, 2021 Советую заменить тип bufferJPG с std::string на, хотя бы, std::vector<uint8_t> и перед циклом вызвать reserve(buf_size). При каждом вызове push_back, если не хватает, аллоцируется память размером в два раза превышающую текущую. Это может быть причиной зависаний. С swscaler не имел дела, но думаю можно поискать в справке для ffmpeg или libswscale. Quote [swscaler @ 0000014ed4dc00c0] Slice parameters 0, 800 are invalid Для начала, нашел такое:https://stackoverflow.com/questions/59778299/ffmpeg-sws-scale-returns-error-slice-parameters-0-2160-are-invalid May RenderDoc/Nsight Graphics/Intel GPA bless you
Recommended Posts