我目前正在处理Windows Media Foundation.但是,由于Microsoft H.264解码器和一些缺少自定义格式的解码器的一些问题,我想知道是否可以直接使用CLSID实例化DirectShow解码器,并围绕它构建一个暴露IMFTransform的代理获得Media Foundation的解码器.所以这是我的问题:
我可以直接实例化Directshow过滤器(首选解码器)并使用它们进行解码(即放置一些压缩帧并获得未压缩的帧)来创建MFT吗?
我知道如何使用其CLSID实例化过滤器本身.但是,我不知道如何使用实际的解码功能.
任何想法,提示,链接任何将被欣赏.谢谢,
J.
我有2个文件.两者的长度相同(以秒为单位):
如何在我的C#应用程序中使用NAudio .NET库用文件#2中的音频覆盖文件#1的音频?我想将最终结果写入磁盘作为新的视频文件.
我相信这可以使用NAudio 1.7的Media Foundation功能,但我无法弄清楚如何修改视频文件的音频流并重新保存视频.
在 Windows 10 build 10.1607.14393.10(又称周年纪念版)上,我无法再获取 MJPG 捕获流。曾经是 MJPG 和 YUY2 分辨率,现在我在 DirectShow(内核流)和 Media Foundation MJPG 中仅获得 YUY2,然后在 IBaseFilter 源连接到任何内容之前将媒体类型转换为 NV12。尝试使用不同相机的多个系统。有什么想法可能是错的吗?
640x480 @30 YUY2
...
640x480 @30 MJPG <- gone
...
DirectShow:
com_t<IAMStreamConfig> sc;
if_failed_return_result(camera_output_pin->QueryInterface(&sc));
int number_of_capabilities = 0;
int capability_size = 0;
if_failed_return(sc->GetNumberOfCapabilities(&number_of_capabilities, &capability_size), -1);
for (int i = 0; i < number_of_capabilities && k < count; i++) {
VIDEO_STREAM_CONFIG_CAPS scc;
assert(sizeof(scc) == capability_size);
AM_MEDIA_TYPE* mt = null;
if_failed_return(sc->GetStreamCaps(i, &mt, (BYTE*)&scc), -1);
...
Run Code Online (Sandbox Code Playgroud)
在MMF中:
640x480 @30 YUY2
...
640x480 @30 …Run Code Online (Sandbox Code Playgroud) webcam directshow video-capture ms-media-foundation windows-10
我正在尝试使用 MediaFoundation 将 ID3D11Texture2D 编码为 mp4。下面是我目前的代码。
初始化接收器写入器
private int InitializeSinkWriter(String outputFile, int videoWidth, int videoHeight)
{
IMFMediaType mediaTypeIn = null;
IMFMediaType mediaTypeOut = null;
IMFAttributes attributes = null;
int hr = 0;
if (Succeeded(hr)) hr = (int)MFExtern.MFCreateAttributes(out attributes, 1);
if (Succeeded(hr)) hr = (int)attributes.SetUINT32(MFAttributesClsid.MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 1);
if (Succeeded(hr)) hr = (int)attributes.SetUINT32(MFAttributesClsid.MF_LOW_LATENCY, 1);
// Create the sink writer
if (Succeeded(hr)) hr = (int)MFExtern.MFCreateSinkWriterFromURL(outputFile, null, attributes, out sinkWriter);
// Create the output type
if (Succeeded(hr)) hr = (int)MFExtern.MFCreateMediaType(out mediaTypeOut);
if (Succeeded(hr)) hr = …Run Code Online (Sandbox Code Playgroud) 对于一个项目,我正在尝试创建一个视频通话应用程序.我正在为通用Windows平台做这个,所以我想我可以使用MediaCapture类.这个类确实有这个StartRecordToCustomSinkAsync()方法,但是为了使用它,我需要创建一个自定义接收器.我开始创建一个,但现在我不得不创建流水槽.此链接解释了Media Sinks,但我找不到关于流接收器的任何文档.
我还研究了Simple Communication,WavSink和另一个自定义接收器示例,但代码缺少注释或解决了另一个问题.
有谁知道我如何实施UWP视频通话应用程序,或指出我正确的方向?
PS.我知道这类问题更多,但没有可用的答案:(
我已经使用 Media Foundation API 编写了一个程序,该程序采用 AVI 文件并将其视频样本解码为未压缩的 RGB 帧。
最近,我发现了一个包含音频和视频轨道的 AVI 文件,但 Windows Media Player 没有播放视频轨道(正在播放音频)。
我试图用另一个播放器(Gom Player)打开文件,它建议我下载额外的编解码器包:LEAD MJPG/MCMP Video Codec。安装后 WMP 开始解码和播放视频轨道。但在那之后,我再次无法使用 MF API 解码文件。
我的猜测是 Media Foundation 仅限于 Windows 提供的内容。那正确吗?
另外,是否有一种方法可以告诉 Media Foundation 使用外部安装的编解码器进行解码?
我正在编写这个库,它通过Media Foundation框架在C++/CLI中实现一些基本的音频播放器功能,这些功能将由托管代码使用.我可以播放音频,停止,暂停等等.对于不熟悉Media Foundation的任何人,媒体会话都会发布您可以处理通知的事件.这是通过使用IMFAsyncCallback对象在会话对象上调用BeginGetEvent来完成的.IMFAsyncCallback定义了应该实现的方法Invoke(IMFAsyncResult)来处理事件.发生事件时,调用方法由工作线程上的会话对象调用,该工作线程具有可以查询事件信息的IMFAsyncResult对象.此结果对象由事件线程创建并拥有.
在我的Invoke实现中,每当我尝试用我传递的IMFAsyncResult对象做任何事情(包括只调用QueryInterface或其他东西)时,我都会得到一个System.AccessViolationException.我实现IMFAsyncCallback的对象是在CRT堆上分配的基本C++类(未托管),并且事件发布在也在CRT堆上分配的会话对象拥有的线程上.
可能导致此异常的原因是什么?
为什么我从普通旧C++实现的代码中抛出.NET托管异常?这就是当你有一个混合模式组件时会发生什么?
.net c++-cli access-violation visual-c++ ms-media-foundation
为什么所有新的视频/媒体容器格式都很少为媒体基础提供支持,而为DirectShow提供更多支持,而又知道DirectShow即将死去。
我可以使用我在此处学习的图像编写视频文件.它使用IMFSample和IMFSinkWriter.现在我想为它添加音频.假设有Audio.wma文件,我希望将该音频写入该视频文件中.
但是在这个样本中无法弄清楚如何做到这一点.像输入和输出类型设置,IMFSample音频缓冲区的创建等等.如果有人能告诉我如何使用接收器编写器将音频添加到视频文件,那将是一件好事.
我有一个特定的要求,即能够从源视频中选择任意矩形区域,并将该区域(在特定时间范围内)保存到单独的文件中.
理想情况下,API将支持C#/ .NET,但我们已准备好在C++中使用它,如果这样可以产生更好的最终产品.
该软件需要在Windows机器上运行.
我研究过Direct Show Editing Services和Media Foundation.我发现有相互矛盾的信息表明DSES已被弃用,但后来使用DSES而不是MF,因为MF并没有那么关注视频编辑.
我还应该研究其他任何API吗?
你能为手头的任务推荐上述任何一种API吗?
提前致谢!
我正在使用Media Foundation(MFT)的H264编码器.
我从中提取了SPS和PPS,因为我需要它来进行流畅的流式传输.
MSDN表示在每个NALU之前出现的长度字段使用的字节数1, 2, or 4.这都是网络字节顺序.如您所见,缓冲区中的前4个字节是0, 0, 0, 1.如果我们应用任何可能的长度,我们什么都得不到.如果用于长度的字节数是1,则长度为零,如果为2,则长度再次为零.如果是4,那么第一个NALU的长度是1?!而且,这不正确.
有谁知道我应该如何解释这个SPS和PPS连接在一起?
