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