FFMPEG-Fehler mit avformat_open_input, der -135 zurückgibt

Ich habe eine DLL, mit der eine meiner Anwendungen Videos von RTSP-Kameras empfängt. Unter der Haube verwendet die DLL FFMPEG-Bibliotheken aus dieser Release-Zip:

ffmpeg-20141022-git-6dc99fd-win64-shared.7z

Wir haben eine Vielzahl von Kameras im Haus und die meisten funktionieren einwandfrei. Bei einem bestimmten Pelco-Modell mit der Nummer IXE20DN-OCP kann ich jedoch keine Verbindung herstellen. Ich habe die Kamera- und RTSP-Verbindungszeichenfolge auf VLC getestet, und die Verbindung zur Kamera ist in Ordnung.

Ich habe die Verbindungszeichenfolge hier gefunden:http: //www.ispyconnect.com/man.aspx? n = Pelco

rtsp://IPADDRESS:554/1/stream1

Ungewöhnlich wird die Verbindung hergestellt, auch wenn der Port von VLC deaktiviert bleibt. Ich schätze, dass dies der Standard-RTSP-Port ist oder dass VLC eine Vielzahl von Dingen versucht, die auf Ihren Eingaben basieren.

In jedem Fall erhalte ich beim Versuch, eine Verbindung herzustellen, eine Fehlermeldung von av_format_open_input. Es gibt einen Code von -135 zurück. Als ich in der Fehlercodeliste nachgesehen habe, habe ich die Liste nicht gesehen. Zum besseren Verständnis habe ich alle Fehler in error.h ausgedruckt, um zu sehen, welche Werte sie haben.

DumpErrorCodes - Error Code : AVERROR_BSF_NOT_FOUND = -1179861752
DumpErrorCodes - Error Code : AVERROR_BUG = -558323010
DumpErrorCodes - Error Code : AVERROR_BUFFER_TOO_SMALL = -1397118274
DumpErrorCodes - Error Code : AVERROR_DECODER_NOT_FOUND = -1128613112
DumpErrorCodes - Error Code : AVERROR_DEMUXER_NOT_FOUND = -1296385272
DumpErrorCodes - Error Code : AVERROR_ENCODER_NOT_FOUND = -1129203192
DumpErrorCodes - Error Code : AVERROR_EOF = -541478725
DumpErrorCodes - Error Code : AVERROR_EXIT = -1414092869
DumpErrorCodes - Error Code : AVERROR_EXTERNAL = -542398533
DumpErrorCodes - Error Code : AVERROR_FILTER_NOT_FOUND = -1279870712
DumpErrorCodes - Error Code : AVERROR_INVALIDDATA = -1094995529
DumpErrorCodes - Error Code : AVERROR_MUXER_NOT_FOUND = -1481985528
DumpErrorCodes - Error Code : AVERROR_OPTION_NOT_FOUND = -1414549496
DumpErrorCodes - Error Code : AVERROR_PATCHWELCOME = -1163346256
DumpErrorCodes - Error Code : AVERROR_PROTOCOL_NOT_FOUND = -1330794744
DumpErrorCodes - Error Code : AVERROR_STREAM_NOT_FOUND = -1381258232
DumpErrorCodes - Error Code : AVERROR_BUG2 = -541545794
DumpErrorCodes - Error Code : AVERROR_UNKNOWN = -1313558101
DumpErrorCodes - Error Code : AVERROR_EXPERIMENTAL = -733130664
DumpErrorCodes - Error Code : AVERROR_INPUT_CHANGED = -1668179713
DumpErrorCodes - Error Code : AVERROR_OUTPUT_CHANGED = -1668179714
DumpErrorCodes - Error Code : AVERROR_HTTP_BAD_REQUEST = -808465656
DumpErrorCodes - Error Code : AVERROR_HTTP_UNAUTHORIZED = -825242872
DumpErrorCodes - Error Code : AVERROR_HTTP_FORBIDDEN = -858797304
DumpErrorCodes - Error Code : AVERROR_HTTP_NOT_FOUND = -875574520
DumpErrorCodes - Error Code : AVERROR_HTTP_OTHER_4XX = -1482175736
DumpErrorCodes - Error Code : AVERROR_HTTP_SERVER_ERROR = -1482175992

Nichts sogar in der Nähe von -135. Ich habe diesen Fehler gefunden, eine Art Stapelüberlauf, hier Laufzeitfehler beim Verknüpfen von ffmpeg-Bibliotheken in qt creator Der Autor gibt an, dass es sich um einen Fehler beim Laden der DLL handelt. Ich bin mir nicht sicher, warum er das gedacht hat, aber ich habe den Rat befolgt und den Abhängigkeits-Walker verwendet http: //www.dependencywalker.com), um zu überprüfen, welche Abhängigkeiten meiner DLL erforderlich waren. Es wurden einige aufgeführt, die jedoch bereits in meinem Installationspaket enthalten waren.

Um sicherzugehen, dass sie gefunden wurden, entfernte ich sie manuell aus der Installation und stellte eine radikale Änderung im Programmverhalten fest (meine DLL wurde nicht geladen und lief überhaupt nicht an).

Also, ich habe ein bisschen Init-Code:

void FfmpegInitialize()
{
 av_lockmgr_register(&LockManagerCb);
 av_register_all();
 LOG_DEBUG0("av_register_all returned\n");
}

Dann habe ich meine Hauptroutine für offene Verbindungen ...

int RTSPConnect(const char *URL, int width, int height, frameReceived callbackFunction)
{

    int errCode =0;
    if ((errCode = avformat_network_init()) != 0)
    {
        LOG_ERROR1("avformat_network_init returned error code %d\n", errCode);  
    }
    LOG_DEBUG0("avformat_network_init returned\n");
    //Allocate space and setup the the object to be used for storing all info needed for this connection
    fContextReadFrame = avformat_alloc_context(); // free'd in the Close method

    if (fContextReadFrame == 0)
    {
        LOG_ERROR1("Unable to set rtsp_transport options.   Error code = %d\n", errCode);
        return FFMPEG_OPTION_SET_FAILURE;
    }

    LOG_DEBUG1("avformat_alloc_context returned %p\n", fContextReadFrame);

    AVDictionary *opts = 0;
    if ((errCode = av_dict_set(&opts, "rtsp_transport", "tcp", 0)) < 0)
    {
        LOG_ERROR1("Unable to set rtsp_transport options.   Error code = %d\n", errCode);
        return FFMPEG_OPTION_SET_FAILURE;
    }
    LOG_DEBUG1("av_dict_set returned %d\n", errCode);

    //open rtsp
    DumpErrorCodes();
    if ((errCode = avformat_open_input(&fContextReadFrame, URL, NULL, &opts)) < 0)
    {
        LOG_ERROR2("Unable to open avFormat RF inputs.   URL = %s, and Error code = %d\n", URL, errCode);       
        LOG_ERROR2("Error Code %d = %s\n", errCode, errMsg(errCode));       
        // NOTE context is free'd on failure.
        return FFMPEG_FORMAT_OPEN_FAILURE;
    }
...

Um sicherzugehen, dass ich den Fehlercode nicht missverstanden habe, habe ich die Fehlermeldung von ffmpeg gedruckt, aber der Fehler wurde nicht gefunden und stattdessen wird meine gespeicherte Fehlermeldung zurückgegeben.

Mein nächster Schritt bestand darin, bei meinem Verbindungsversuch und beim VLC-Verbindungsversuch Wireshark anzuschließen und herauszufinden, welche Unterschiede (falls vorhanden) das Problem verursachen und was ich mit ffmpeg tun kann, damit es funktioniert. Wie gesagt, ich habe ein Dutzend anderer Kameras im Haus, die RTSP verwenden, und sie funktionieren mit meiner DLL. Einige verwenden auch Benutzernamen / Passwörter / etc (daher weiß ich, dass das nicht das Problem ist).

Auch meine Laufprotokolle:

FfmpegInitialize - av_register_all returned
Open - Open called.  Pointers valid, passing control.
Rtsp::RtspInterface::Open - Rtsp::RtspInterface::Open called
Rtsp::RtspInterface::Open - VideoSourceString(35) = rtsp://192.168.14.60:554/1/stream1
Rtsp::RtspInterface::Open - Base URL = (192.168.14.60:554/1/stream1)
Rtsp::RtspInterface::Open - Attempting to open (rtsp://192.168.14.60:554/1/stream1) for WxH(320x240) video
RTSPSetFormatH264 - RTSPSetFormatH264
RTSPConnect - Called
LockManagerCb - LockManagerCb invoked for op 1
LockManagerCb - LockManagerCb invoked for op 2
RTSPConnect - avformat_network_init returned
RTSPConnect - avformat_alloc_context returned 019E6000
RTSPConnect - av_dict_set returned 0
DumpErrorCodes - Error Code : AVERROR_BSF_NOT_FOUND = -1179861752
...
DumpErrorCodes - Error Code : AVERROR_HTTP_SERVER_ERROR = -1482175992
RTSPConnect - Unable to open avFormat RF inputs.   URL = rtsp://192.168.14.60:554/1/stream1, and Error code = -135
RTSPConnect - Error Code -135 = No Error Message Available

Ich werde mit Wireshark weitermachen, möchte aber die Herkunft des -135-Fehlercodes von ffmpeg erfahren. Wenn ich mir den Code ansehe, wenn 'ret' auf -135 gesetzt wird, muss dies auf den Rückgabecode einer Hilfsmethode zurückzuführen sein und nicht direkt im avformat_open_input Methode

https: //www.ffmpeg.org/doxygen/2.5/libavformat_2utils_8c_source.html#l0039

Nach dem Upgrade auf den neuesten täglichen ffmpeg-Build erhalte ich Daten zu wireshark. Echtzeit-Streaming-Protokoll:

Request: SETUP rtsp://192.168.14.60/stream1/track1 RTSP/1.0\r\n
Method: SETUP
URL: rtsp://192.168.14.60/stream1/track1
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
CSeq: 3\r\n
User-Agent: Lavf56.31.100\r\n
\r\n

Die Antwort darauf ist der erste "Fehler", den ich bei der Initiierung feststellen kann.

Response: RTSP/1.0 461 Unsupported Transport\r\n
Status: 461
CSeq: 3\r\n
Date: Sun, Jan 04 1970 16:03:05 GMT\r\n
\r\n

Ich gehe davon aus, dass ... es bedeutet, dass der von uns ausgewählte Transport nicht unterstützt wurde. Ich überprüfe schnell den Code und sehe, dass ich 'tcp' gewählt habe. In der Antwort auf den Befehl DESCRIBE wird Folgendes angezeigt:

Media Protocol: RTP/AVP

Wenn SETUP von ffmpeg ausgegeben wird, gibt es außerdem Folgendes an:

Transport: RTP/AVP/TCP;unicast;interleaved=0-1

Ich werde versuchen, hier bei Misserfolg einen anderen Transporttyp zu wählen und zu sehen, wie das funktioniert. Ich weiß immer noch nicht, wo die -135 herkommt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage