我正在使用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);
}
}
您可以使用自定义源过滤器(特别是基于"PushSource"SDK示例/从中派生)构建DirectShow管道,这些过滤器注入从上面引用的事件中提供的数据。这两个将连接到所谓的MPEG-4多路复用器,例如来自GDCL的免费多路复用器或兼容多路复用器。然后前者将连接到文件写入程序。此管道将把事件中的数据转换为MP4文件。
不过,编写过滤器需要C++开发。我不确定,但DirectShowLib可能为托管环境提供了一种桥梁,这样你就可以避免接触C++。
您也可以使用"英特尔IPP库"(英特尔媒体SDK?)生成MP4文件,不过我认为它也需要C++而不是C#。