如何在不使用C#重新编码的情况下将二进制流直接写入MPEG-4 AVC(mp4)容器

本文关键字:二进制 容器 mp4 AVC MPEG-4 情况下 新编码 编码 | 更新日期: 2023-09-27 18:20:59

我正在使用Axis媒体解析器SDK获取h264流,如何在C#中直接在MPEG-4 AVC(mp4)容器中写入该流,而不会重新编码和丢失视频质量

目前,这两个事件被触发以将音频和视频写入文件

private void OnVideoSample(int cookieID, int sampleType,
    int sampleFlags, ulong startTime, ulong stopTime, object SampleArray)
{
    // Cast the buffer object to a byte array
    byte[] bufferBytes = (byte[])SampleArray;
    Console.WriteLine("OnVideoSample - {0} bytes", bufferBytes.Length);
    // Write the data to out file
    lock (fileLock)
    {
        outFile.Write(sampleType);
        outFile.Write(sampleFlags);
        outFile.Write(startTime);
        outFile.Write(stopTime);
        outFile.Write(bufferBytes.Length);
        outFile.Write(bufferBytes, 0, bufferBytes.Length);
    }
}
// Event handler callback for audio samples buffers
private void OnAudioSample(int cookieID, int sampleType,
    int sampleFlags, ulong startTime, ulong stopTime, object SampleArray)
{
    // Cast the buffer object to a byte array
    byte[] bufferBytes = (byte[])SampleArray;
    Console.WriteLine("OnAudioSample - {0} bytes", bufferBytes.Length);
    // Write the data to out file
    lock (fileLock)
    {
        outFile.Write(sampleType);
        outFile.Write(sampleFlags);
        outFile.Write(startTime);
        outFile.Write(stopTime);
        outFile.Write(bufferBytes.Length);
        outFile.Write(bufferBytes, 0, bufferBytes.Length);
    }
}

如何在不使用C#重新编码的情况下将二进制流直接写入MPEG-4 AVC(mp4)容器

您可以使用自定义源过滤器(特别是基于"PushSource"SDK示例/从中派生)构建DirectShow管道,这些过滤器注入从上面引用的事件中提供的数据。这两个将连接到所谓的MPEG-4多路复用器,例如来自GDCL的免费多路复用器或兼容多路复用器。然后前者将连接到文件写入程序。此管道将把事件中的数据转换为MP4文件。

不过,编写过滤器需要C++开发。我不确定,但DirectShowLib可能为托管环境提供了一种桥梁,这样你就可以避免接触C++。

您也可以使用"英特尔IPP库"(英特尔媒体SDK?)生成MP4文件,不过我认为它也需要C++而不是C#。