2015-05-06 3 views
2

Я пытаюсь обрабатывать пакеты с librtmp, но получаю ошибку «free(): invalid pointer».librtmp free(): invalid pointer

#include <stdio.h> 
#include <stdlib.h> 
#include <librtmp/rtmp.h> 
#include <librtmp/log.h> 

int main(){ 
    RTMP *r; 
    RTMPPacket packet; 

    char uri[] = "rtmp://167.114.171.21:1936/tinyconf app=tinyconf timeout=180000 live=1 conn=S:ROOMNAME swfurl=http://tinychat.com/embed/Tinychat-11.1-1.0.0.0602.swf"; 

    RTMP_LogLevel loglvl=RTMP_LOGDEBUG2; 
    RTMP_LogSetLevel(loglvl); 

    r = RTMP_Alloc(); 
    RTMP_Init(r); 
    RTMP_SetupURL(r, (char*)uri); 
    RTMP_Connect(r, NULL); 

    while (RTMP_IsConnected(r)) { 
     RTMP_ReadPacket(r, &packet); 
     if (!RTMPPacket_IsReady(&packet)) 
      continue; 
     RTMP_ClientPacket(r, &packet); 
     RTMPPacket_Free(&packet); 
    } 

    RTMP_Close(r); 
    RTMP_Free(r); 

    return 1; 
} 

Here's a link to the log/backtrace. (Как это довольно долго)

Я не уверен, почему это происходит, это проблема с моим кодом или самой librtmp?

+0

'пакет' неинициализирован. И в журналах, которые вы отправили, ваш процесс выходит из строя в том, что, скорее всего, ваш первый вызов «RTMP_ReadPacket()», который вы впервые используете «пакет». –

+0

@AndrewHenle Я не думаю, что здесь проблема, поскольку я видел другой код (например, привязки python-librtmp), и там пакет создается с помощью пакета RTMPPacket; Но я поиграю с ним немного позже. –

ответ

0

С использованием RTMPPacket_Alloc(packet, size); работал, хотя я видел, что другой код не использует его (я думаю). Во всяком случае, это рабочий пример.

#include <stdio.h> 
#include <stdlib.h> 
#include <librtmp/rtmp.h> 
#include <librtmp/log.h> 

int main(){ 
    RTMP *r; 
    RTMPPacket packet; 
    RTMPPacket_Alloc(&packet, 4096); 

    char uri[] = "rtmp://167.114.171.21:1936/tinyconf app=tinyconf timeout=180000 live=1 conn=S:ROOMNAME swfurl=http://tinychat.com/embed/Tinychat-11.1-1.0.0.0602.swf"; 

    RTMP_LogLevel loglvl=RTMP_LOGDEBUG2; 
    RTMP_LogSetLevel(loglvl); 

    r = RTMP_Alloc(); 
    RTMP_Init(r); 
    RTMP_SetupURL(r, (char*)uri); 
    RTMP_Connect(r, NULL); 

    while (RTMP_IsConnected(r)) { 
     RTMP_ReadPacket(r, &packet); 
     if (!RTMPPacket_IsReady(&packet)) 
      continue; 
     RTMP_ClientPacket(r, &packet); 
     RTMPPacket_Free(&packet); 
    } 

    RTMP_Close(r); 
    RTMP_Free(r); 

    return 1; 
}