Mux Audio and Video Into MP4

This topic describes how to use the TTranscoder 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 mux(const Options& opt)
{
    deleteFile(opt.output_file.c_str());

    try {
        TTranscoder transcoder;
        transcoder.allowDemoMode(true);

        TMediaSocket outputSocket;
        outputSocket.file(opt.output_file).streamType(StreamType::MP4);

        // audio inputs
        for (const auto& audioFile : opt.input_audio)
        {
            transcoder.addInput(
                TMediaSocket()
                    .file(audioFile)
                    .streamType(StreamType::MP4)
            );
            outputSocket.addPin(TMediaPin()
                .streamInfo(TAudioStreamInfo()
                    .streamType(StreamType::AAC)));

            std::println("Muxing audio input: {}", audioFile);
        }

        // video inputs
        for (const auto& videoFile : opt.input_video)
        {
            transcoder.addInput(
                TMediaSocket()
                    .file(videoFile)
                    .streamType(StreamType::MP4)
            );
            outputSocket.addPin(TMediaPin()
                .streamInfo(TVideoStreamInfo()
                    .streamType(StreamType::H264)));

            std::println("Muxing video input: {}", videoFile);
        }

        transcoder.addOutput(outputSocket);
        transcoder.open().run().close();

        std::println("Output file: {}", opt.output_file);
        return true;

    } catch (const TAVBlocksException& ex) {
        std::println(stderr, "AVBlocks error: {}", ex.what());
        return false;
    } catch (const std::exception& ex) {
        std::println(stderr, "Error: {}", ex.what());
        return false;
    }
}