hi,

I have written a simple program to stream an ADTS AAC file that I
extracted from an MPEG-4 file using mp4create -extract.  I based my test
program off of ADTSAudioFileServerMediaSubsession and
ADTSAudioFileSource.  When I open the stream with VLC on my remote pc,
it connects but does not decode any audio.  One of the things that I am
unsure of is the payloadFormatCode to use, I guessed 14 (mpa).  What
else am I missing here?  

I have attached my test program.

thanks,
mike
#include <iostream>
#include "liveMedia.hh"
#include "GroupsockHelper.hh"

#include "BasicUsageEnvironment.hh"

UsageEnvironment* env;

void play(); // forward

int main(int argc, char** argv) {
    // Begin by setting up our usage environment:
    TaskScheduler* scheduler = BasicTaskScheduler::createNew();
    env = BasicUsageEnvironment::createNew(*scheduler);

    play();

    env->taskScheduler().doEventLoop(); // does not return
    return 0; // only to prevent compiler warnings
}

char const* inputFileName = "adts";

void afterPlaying(void* clientData); // forward

struct sessionState_t {
    FramedSource* source;
    RTPSink* sink;
    RTCPInstance* rtcpInstance;
    Groupsock* rtpGroupsock;
    Groupsock* rtcpGroupsock;
    RTSPServer* rtspServer;
} sessionState;

void play() {
    ADTSAudioFileSource* source = ADTSAudioFileSource::createNew(*env, inputFileName);

    if (source == NULL) {
        *env << "Unable to open file \"" << inputFileName << "\" as a WAV audio file source: " << env->getResultMsg() << "\n";
        exit(1);
    }

    sessionState.source = source;
/*
    unsigned char const bitsPerSample = 8;
    unsigned const samplingFrequency = 8000;
    unsigned char const   numChannels = 1;
    unsigned  bitsPerSecond = 64000;*/
    char* mimeType = "audio/PCMU";
    unsigned char payloadFormatCode = 0;
    char* destinationAddressStr = "192.168.0.13";
    //char* destinationAddressStr = "127.0.0.1";

/*    *env << "Audio source parameters:\n\t" << samplingFrequency << " Hz, ";
    *env << bitsPerSample << " bits-per-sample, ";
    *env << numChannels << " channels => ";
    *env << bitsPerSecond << " bits-per-second\n";*/
  
    struct in_addr destinationAddress;
    destinationAddress.s_addr = our_inet_addr(destinationAddressStr);

    const unsigned short rtpPortNum = 6666;
    const unsigned short rtcpPortNum = rtpPortNum+1;
    const unsigned char ttl = 1; //was 255
    const Port rtpPort(rtpPortNum);
    const Port rtcpPort(rtcpPortNum);

    sessionState.rtpGroupsock = new Groupsock(*env, destinationAddress, rtpPort, ttl);
    sessionState.rtcpGroupsock = new Groupsock(*env, destinationAddress, rtcpPort, ttl);

//     std::cout << "going to create rtp sink : " << (int)payloadFormatCode << "  " << samplingFrequency << "  " 
//                                 << mimeType << "  " << (int)numChannels << std::endl;

//     sessionState.sink = SimpleRTPSink::createNew(*env, sessionState.rtpGroupsock, payloadFormatCode, 
//                                 samplingFrequency, "audio/PCMU", mimeType, numChannels);


    sessionState.sink = MPEG4GenericRTPSink::createNew(*env, sessionState.rtpGroupsock,
                    14, source->samplingFrequency(),
                    "audio", "AAC-hbr", source->configStr(),
                    source->numChannels());





    const unsigned estimatedSessionBandwidth = 96; //bitsPerSecond/1000;
    const unsigned maxCNAMElen = 100;
    unsigned char CNAME[maxCNAMElen+1];
    gethostname((char*)CNAME, maxCNAMElen);
    CNAME[maxCNAMElen] = '\0'; // just in case
    std::cout << "going to create rtcp sink: " << estimatedSessionBandwidth << std::endl;
    sessionState.rtcpInstance = RTCPInstance::createNew(*env, sessionState.rtcpGroupsock, 
                                estimatedSessionBandwidth, CNAME, sessionState.sink, NULL, False);

    // Finally, start the streaming:
    *env << "Beginning streaming...\n";
    sessionState.sink->startPlaying(*sessionState.source, afterPlaying, NULL);
}


void afterPlaying(void* /*clientData*/) {
  *env << "...done streaming\n";

  // End by closing the media:
  Medium::close(sessionState.rtspServer);
  Medium::close(sessionState.rtcpInstance);
  Medium::close(sessionState.sink);
  delete sessionState.rtpGroupsock;
  Medium::close(sessionState.source);
  delete sessionState.rtcpGroupsock;

  // We're done:
  exit(0);
}
_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to