Mux Audio and Video Into MP4
Contents
Mux Audio and Video Into MP4#
This topic describes how to use the Transcoder class to mux AAC audio and H.264 video into an MP4 file.
The code snippets in this article are from the mux_mp4_file sample.
Complete C++ code#
bool MP4Mux(const Options& opt)
{
deleteFile(opt.output_file.c_str());
primo::ref<Transcoder> transcoder (Library::createTranscoder());
// Transcoder demo mode must be enabled,
// in order to use the production release for testing (without a valid license)
transcoder->setAllowDemoMode(TRUE);
primo::ref<MediaSocket> outputSocket(Library::createMediaSocket());
outputSocket->setFile(opt.output_file.c_str());
outputSocket->setStreamType(StreamType::MP4);
// audio
for(int i = 0; i < (int)opt.input_audio.size(); i++)
{
primo::ref<MediaPin> outputPin(Library::createMediaPin());
primo::ref<AudioStreamInfo> asi(Library::createAudioStreamInfo());
asi->setStreamType(StreamType::AAC);
outputPin->setStreamInfo(asi.get());
outputSocket->pins()->add(outputPin.get());
primo::ref<MediaSocket> inputSocket(Library::createMediaSocket());
inputSocket->setFile(opt.input_audio[i].c_str());
inputSocket->setStreamType(StreamType::MP4);
transcoder->inputs()->add(inputSocket.get());
wcout << "Muxing audio input: " << opt.input_audio[i] << endl;
}
// video
for (int i = 0; i < (int)opt.input_video.size(); i++)
{
primo::ref<MediaPin> outputPin(Library::createMediaPin());
primo::ref<VideoStreamInfo> vsi(Library::createVideoStreamInfo());
vsi->setStreamType(StreamType::H264);
outputPin->setStreamInfo(vsi.get());
outputSocket->pins()->add(outputPin.get());
primo::ref<MediaSocket> inputSocket(Library::createMediaSocket());
inputSocket->setFile(opt.input_video[i].c_str());
inputSocket->setStreamType(StreamType::MP4);
transcoder->inputs()->add(inputSocket.get());
wcout << "Muxing video input: " << opt.input_video[i] << endl;
}
transcoder->outputs()->add(outputSocket.get());
if (!transcoder->open())
{
printError(L"Open Transcoder", transcoder->error());
return false;
}
if (!transcoder->run())
{
printError(L"Run Transcoder", transcoder->error());
return false;
}
transcoder->close();
wcout << "Output file: " << opt.output_file << endl;
return true;
}