Установка формата для потоковой передачи rtsp через библиотеку libvl c - PullRequest
0 голосов
/ 25 мая 2020

Я пытался отформатировать ввод, который я получаю из потока rtsp, предоставленного моей камерой c611w4. Я могу транслировать его напрямую через VLCPlayer, и я также могу отображать один кадр, если я пропускаю часть libvlc_video_set_format, но как только я пытаюсь отформатировать изображение, приложение терпит неудачу.

Вот код:

void CRemoteC611W4Camera::Init(int _width, int _height, int _channelCount) {
    m_VLCArgumentVector.push_back("--no-audio");
    m_VLCArgumentVector.push_back("--no-xlib");
    m_VLCArgumentVector.push_back("-vvv");

    int argc = m_VLCArgumentVector.size();
    const char* argv[argc];
    for(unsigned int i = 0; i < m_VLCArgumentVector.size(); i++) {
        argv[i] = m_VLCArgumentVector.at(i).c_str();
    }

    m_VLCInstance = libvlc_new(argc, argv);
    m_VLCMedia = libvlc_media_new_location(m_VLCInstance, "rtsp://admin:admin@192.168.0.100:554/11");
    m_VLCPlayer = libvlc_media_player_new_from_media(m_VLCMedia);
    libvlc_media_release(m_VLCMedia);
    m_CurrentImage.Create(_width, _height, 4);

    auto lock = [](void *_data, void **_pixels) -> void* {
        CRemoteC611W4Camera* thisContext = (CRemoteC611W4Camera*)_data;
        thisContext->m_ImageFetchMutex.Lock();
        return *_pixels = thisContext->m_CurrentImage.GetDataPointer();
    };
    auto unlock = [](void* _data, void* _id, void *const *_pixels) {
        CRemoteC611W4Camera* thisContext = (CRemoteC611W4Camera*)_data;
        thisContext->m_ImageFetchMutex.Unlock();
    };
    auto display = [](void *_data, void *_id) {
        (void) _data;
    };

    libvlc_video_set_callbacks(m_VLCPlayer, lock, unlock, display, this);
    libvlc_video_set_format(m_VLCPlayer, "RGBA", _width, _height, _width*4);
    libvlc_media_player_play(m_VLCPlayer);
    usleep(10000000);
}

Обратите внимание, что m_CurrentImage является членом класса CRemoteC611W4Camera с его определением:

struct CImageFormat {
public:
    int m_Width;
    int m_Height;
    int m_ChannelCount;
    CImageFormat(int _width, int _height, int _channelCount) : m_Width(_width), m_Height(_height), m_ChannelCount(_channelCount) {}
};

class CRGB24Image {
public:
    CRGB24Image() : m_Data(nullptr), m_Format(0, 0, 3) {}
    virtual ~CRGB24Image() {}

    size_t Create(const CRGB24Image& _img);
    size_t Create(int _w, int _h, int _channelCount);
    void Destroy();
    int At(int _w, int _h, int _c) const;

    unsigned char* GetDataPointer() const { return m_Data; }
    int GetWidth() const { return m_Format.m_Width; }
    int GetHeight() const { return m_Format.m_Height; }
    int GetChannelCount() const { return m_Format.m_ChannelCount; }
private:
    unsigned char* m_Data;
    CImageFormat m_Format;
};



size_t CRGB24Image::Create(int _w, int _h, int _channelCount) {
    Destroy();
    m_Data = (unsigned char*)aligned_alloc(32, _w*_h*_channelCount);
    m_Format.m_Width = _w;
    m_Format.m_Height = _h;
    m_Format.m_ChannelCount = _channelCount;
    return _w*_h*_channelCount;
}

size_t CRGB24Image::Create(const CRGB24Image& _img) {
    Destroy();
    size_t retVal = Create(_img.m_Format.m_Width, _img.m_Format.m_Height, _img.m_Format.m_ChannelCount);
    memcpy(m_Data, _img.m_Data, retVal);
    return retVal;
}
...