O aplicativo de câmera IP OpenCV trava [h264 @ 0xxxxx] imagem ausente na unidade de acesso

9

Eu tenho um aplicativo opencv no cpp.

Ele captura o fluxo de vídeo e o salva em arquivos de vídeo com as construções simples da opencv.

Funciona perfeitamente com a minha webcam.

Mas, ele pode falhar depois de cerca de dez segundos, enquanto eu corro para capturar o fluxo do IP Camara.

Meu comando de compilação é:

g++ -O3 IP_Camera_linux.cpp -o IP_Camera 'pkg-config --cflags --libs opencv'

Meu stream da IP cam é acessado assim:

const string Stream = "rtsp://admin:xxxx@192.168.0.101/";

Funciona perfeitamente, mostra vídeo e salva até que o vídeo exibido congele e o aplicativo trave. Enquanto a mensagem de erro no terminal é:

[h264 @ 0x15e6f60] error while decoding MB 59 31, bytestream (-20)
[h264 @ 0x15e8200] error while decoding MB 61 27, bytestream (-3)
[h264 @ 0x109c880] missing picture in access unit
[h264 @ 0x109c000] no frame!

No meu entender, as duas primeiras linhas da mensagem de erro acima podem ter algo a fazer, mas não causam falhas no aplicativo. As duas últimas linhas são provavelmente as razões ou a causa?

Alguma ajuda?

    
por tod 26.10.2015 в 18:37
fonte

3 respostas

3

Obtive a solução depois de muito sucesso e julgamento. Apenas alterei o endereço do stream um pouco e funcionou.

De:

const string Stream = "rtsp://admin:xxxx@192.168.0.101/";

Para:

const string Stream = "rtsp://admin:xxxx@192.168.0.101/ch1-s1?tcp";

Nenhuma ideia, que mudança fez?

MAS FUNCIONA PERFEITAMENTE !!!

Mesmo os avisos generalizados do formulário:

[h264 @ 0x15e6f60] error while decoding MB 59 31, bytestream (-20)
[h264 @ 0x15e8200] error while decoding MB 61 27, bytestream (-3) 

sumiram.

De qualquer forma agradeceria se alguém pudesse explicá-lo com a razão lógica por trás.

CRÉDITO

    
por tod 04.11.2015 / 15:38
fonte
0

É um erro do ffmpeg. Provavelmente o seu ffmpeg é uma versão antiga e você pode querer atualizá-lo. Ele resolveu o problema perfeitamente para o meu caso, reinstalando o mais recente opencv e ffmpeg da seguinte forma:

  • Instale o ffmpeg mais recente

    git clone git://source.ffmpeg.org/ffmpeg.git
    cd ffmpeg 
    ./configure --enable-shared --disable-static 
    make 
    sudo make install
    
  • Instale o mais recente opencv

    git clone git@github.com:opencv/opencv.git
    cd opencv
    mkdir build
    cd build 
    cmake ../ -DCMAKE_BUILD_TYPE=Release
    make
    sudo make install
    
por thanhtang 09.11.2016 / 14:42
fonte
-1

Como citação para a resposta original , adicionar ? tcp ao final força a conexão rtsp para executar usando o protocolo tcp em vez do protocolo udp que é útil se você não verificar ativamente qualquer problema de conexão e, portanto, você não pode dar ao luxo de ter qualquer perda de pacotes.

Para uma execução robusta, você pode verificar a imagem NULL em seu loop e, se obtiver uma imagem NULL, poderá redefinir a conexão da câmera:

IplImage *img = cvQueryFrame(camera);
        if (img == NULL) {
            printf("img == null ");
            fflush(stdout);
            camera = cvCreateFileCapture("rtsp://admin:xxxx@192.168.0.101/ch1-s1?tcp");
        }
    
por fatihk 06.11.2015 / 18:01
fonte