2016-05-31 2 views
0

J'essaie de diffuser H264 vers VLC via RTP sans RTSP, c'est-à-dire recevoir le flux H.264 de la caméra IP, et l'envoyer à VLC sur un autre hôte. VLC a ouvert l'URL "rtp: // @: 12345". Notez que openRTSP faire la même chose, mais les données de sortie dans le fichier en utilisant la classe H264VideoFileSink, je remplace cette partie du code:utiliser live555 pour diffuser H264 à VLC

if (strcmp(subsession->mediumName(), "video") == 0) { 
    if (strcmp(subsession->codecName(), "H264") == 0) { 
     // For H.264 video stream, we use a special sink that adds 'start codes', 
     // and (at the start) the SPS and PPS NAL units: 
     //fileSink = H264VideoFileSink::createNew(*env, outFileName, 
      //   subsession->fmtp_spropparametersets(), 
      //   fileSinkBufferSize, oneFilePerFrame); 

     char const* outputAddressStr = "192.168.1.123"; // this could also be unicast 
     struct in_addr outputAddress; 
     outputAddress.s_addr = our_inet_addr(outputAddressStr); 

     const Port outputPort(12345); 
     unsigned char const outputTTL = 255; 

     Groupsock outputGroupsock(*env, outputAddress, outputPort, outputTTL); 
     rtpSink = H264VideoRTPSink::createNew(*env, &outputGroupsock, 96); 
    } 
… 

puis,

subsession->sink = rtpSink; 
    subsession->sink->startPlaying(*(subsession->readSource()), 
     subsessionAfterPlaying, 
     subsession); 

Le résultat est que openRTSP est en cours d'exécution, mais VLC a reçu rien. J'ai utilisé Wireshark pour vérifier, aucun paquet envoyé à destination IP et port.

J'essaie également testMP3Streamer, remplacer l'adresse de multidiffusion avec l'adresse unicast aboved. VLC pourrait le jouer. Quelqu'un pourrait-il me donner quelques suggestions?

Répondre

0

Il y a des erreurs de severals dans votre code, d'abord la portée Groupsock est trop étroite, à côté est un besoin H264 Framer pour alimenter un H264VideoRTPSink, comme vous pouvez le voir dans H264VideoRTPSink.cpp:

Boolean H264VideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { 
    // Our source must be an appropriate framer: 
    return source.isH264VideoStreamFramer(); 
} 

Puis mettre tous ensemble donnera quelque chose comme:

char const* outputAddressStr = "192.168.1.123"; 
struct in_addr outputAddress; 
outputAddress.s_addr = our_inet_addr(outputAddressStr); 

const Port outputPort(12345); 
unsigned char const outputTTL = 255; 

Groupsock* outputGroupsock = new Groupsock(*env, outputAddress, outputPort, outputTTL); 
rtpSink = H264VideoRTPSink::createNew(*env, outputGroupsock, 96); 

subsession->addFilter(H264VideoStreamDiscreteFramer::createNew(*env, subsession->readSource()));    
+0

Cela fonctionne! VLC dit "Une description au format SDP est nécessaire pour recevoir le flux RTP. Notez que les URI rtp: // ne peuvent pas fonctionner avec le format de charge utile RTP dynamique (96). »Cela signifie que les paquets RTP ont été réellement reçus par VLC. Je vous remercie. – myggao