给定的URL的字节流类型是不支持的MediaFoundation
我需要从buffer(即 wav字节)创建一个读者才能这样做: : void co_AudioEncoderMF::load_from_memory(unsigned char const * data, long data_size) { unsigned char * buf = new unsigned char[data_size]; //JUST FOR TEST IN ORDER TO BE SURE THAT I HAVE THIS DATA memcpy(buf, data, data_size); IMFMediaType *input_type = nullptr; IMFSourceReader *source_reader = nullptr; IMFMediaType *ouput_media_type = nullptr; IMFSinkWriter *sink_writer = nullptr;
0 2024-03-19
编程技术问答社区
当使用Media Foundation时,如何从 "unsigned char const *"读取?
我有这样的实现 void coAudioPlayerSampleGrabber::test(SoundDataType dataType, unsigned char const * pData, int64_t dataLen) { HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); IMFSourceReader *pReader = NULL; IMFByteStream * spByteStream = NULL; HRESULT hr = S_OK; // Initialize the COM library. hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); // Initialize the Medi
0 2024-03-19
编程技术问答社区
用媒体基金会从文件中播放音频到扬声器
我正在尝试播放从MP4文件到扬声器的音轨.我知道媒体基金会能够使用Topoedit工具播放音频流. 在下面的示例代码中,我没有使用媒体会话或拓扑.我正在尝试手动将媒体源连接到水槽作者.我要这样做的原因是我最终打算从网络中获取源样本,而不是从文件中获取源样本. 运行下面的示例时,我在psinkwriter-> Writesample行上遇到的错误是MF_E_INVALIDREQUEST(0XC00D36B2).因此,我怀疑有我没有正确汇款的东西. #include #include #include #include #include #pragma comment(lib, "mf.lib") #pragma comment(lib, "mfplat.lib") #pragma comment(lib, "mfplay.lib") #pragma comm
0 2024-03-19
编程技术问答社区
使用SharpDx或IMSourceReader从mp4文件中读取第二条音轨流
我在应用程序中有一个要求,在该应用程序中,我必须从MP4文件中读取所有可用的跟踪流. MP4文件编码AAC格式的曲目数量.我必须解码以从文件中获取所有可用的曲目.目前,我正在使用SharpDX和Imsourcereader(Media Foundation DLL)阅读流.但是默认情况下,Sourcereader仅返回文件中的第一个音频流.我做的正确吗?或者我必须使用其他任何第三方库来实现这一目标? 解决方案 配置阅读器,您可以在阅读样本时选择哪些流将传递.通常,您不希望选择流.一个例子是一部电影,其中包含其他音频流(西班牙语,法语或导演评论).结果,大多数时间流选择与以下内容一样简单: // error checking omitted for brevity hr = reader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, nullptr, audioMediaType); h
4 2024-03-19
编程技术问答社区
IMFTransform SetInputType()/SetOutputType()失败。
我正在尝试使用Washapi共享模式和Windows 7上的Media Foundation ImfSourcereader播放MP3(和类似的音频文件)7.据我了解,我必须在IMFSourcereader解码和Wasapi Playback之间使用IMFtransform.除了我在iMftransform上调用setInputType()/setOutputtype()时,一切似乎都很好? 代码的相关片段是: MFCreateSourceReaderFromURL(...); // Various test mp3 files ... sourceReader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_AUDIO_STREAM, &reader.audioType); //sourceReader->GetNativeMediaType(MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, &r
0 2024-03-19
编程技术问答社区
使用Windows Media Foundation中的Sink Writer向视频添加音频样本
我可以使用我使用此示例,但无法弄清楚如何在此样本中执行此操作.诸如输入和输出类型设置,IMFSample为音频缓冲区的创建等. 解决方案 媒体基金会非常适合使用,我相信您可以快速修改您的项目以完成此操作. 概述: 创建新的IMFMediaSource以读取来自音频文件的示例,在接收器中添加音频流,然后使用相应的流索引交织. . 详细信息: 修改VideoGenerator::InitializeSinkWriter(..)功能以正确初始化水槽以容纳音频流.在该功能中,正确创建 audiotypeout 和 audiotypein (IMFMediaType).您可能需要重命名 mediatypeout 和 mediatipein videotypeOut 和 videotypein solarity clarity,这看起来如下: ComPtr videoTypeOut; //
0 2024-03-19
编程技术问答社区
如何将16Bit字节数组正确转换为音频剪辑数据?
我与Media Foundataion合作,我需要做的就是将声音样品框架从字节转换为音频浮点数据.为了做到这一点,我使用这种方法(我在Google的某个地方找到了: private static float[] Convert16BitByteArrayToAudioClipData(byte[] source, int headerOffset, int dataSize) { int wavSize = BitConverter.ToInt32(source, headerOffset); headerOffset += sizeof(int); Debug.AssertFormat(wavSize > 0 && wavSize == dataSize, "Failed to get valid 16-bit wav size: {0} from data bytes: {1} at offset: {2}", w
0 2024-03-19
编程技术问答社区
无法使用媒体基金会的sinkwriter向MP4文件添加音频流
我试图使我的编码器起作用已有一个星期... 所以是: 我使用MF的接收器创建一个文件. 我写所有我的视频样本. - >(如果我停在那里并调用完成方法,我可以使用vlc读取文件,但是如果我做波纹管,则文件将被"损坏") 我写所有的音频样本. 我调用完成功能,并得到一个Hresult代码:"接收器无法创建有效的输出文件,因为未向接收器提供所需的标头".我完全理解错误,只是我没有解决问题... 如果你们需要任何代码,我会很高兴将其放在这里. 解决方案 我刚开始使用MP4容器时遇到了此确切的错误(在最终确定接收器时). 错误0xc00d4a45:接收器无法创建有效的输出文件,因为 未提供所需的标题. 您没有提及您要喂入水槽的音频样本的子类型,也没有提及添加的音频流的哪个子类型(用于输出),但是我相信您的问题与后者有关. 使用Media Foundation开发,MP4容器最容易使用MFAudioFormat_AAC或MFAudioF
0 2024-03-19
编程技术问答社区
从非托管代码中获取System.AccessViolationException?
我正在编写此库,该库通过媒体基础框架在C ++/CLI中实现了一些基本的音频播放器功能,该框将被托管代码消费.我可以播放音频,停止,暂停等.对于任何不熟悉媒体基金会的人,媒体会话发布了您可以进行通知的事件.这是通过使用iMfasynccallback对象在会话对象上调用begingetevent来完成的. Imfasynccallback定义了您应该实现的方法来处理事件的方法(iMfasyncresult).事件发生时,将通过iMfasyncresult对象的工作线程上的会话对象调用调用方法,您可以查询事件信息.此结果对象由事件线程创建和拥有. 在我实现Invoke时,每当我尝试使用我被传递的iMfasyncresult对象进行任何操作(包括调用QueryInterface或某些东西)时,我都会得到一个System.AccessVioLationException.我实现的对象Imfasynccallback是在CRT堆上分配的基本C ++类(未管理),事件发布在CRT HEAP上
4 2024-01-09
编程技术问答社区
将AAC转换为WAV
我已经在使用媒体基金会API(感谢MFMANAGEDENCODE, http://blogs.msdn.com/b/mf/archive/2010/02/18/mfmanagedencode.aspx )以将WAV转换为AAC.我还没有完全围绕着它的工作方式,但很幸运. . 现在我发现,即使有一个MF编解码器(AAC解码器),我也很难以其他方式转码.我找不到如何使用此方法的示例,至少可以说,我发现MSDN文档cryptic.有人运气吗? c#包装器是理想的. tia. 解决方案 我一直在使用naudio进行任何音频处理和抽象.它可以作为nuget提供.它具有媒体基金会(以及其他)的包装编码. 这是一个用于编码AAC的样本,并使用Naudio返回WAV: using System; using NAudio.Wave; namespace ConsoleApplication11 { class Program { st
10 2024-01-06
编程技术问答社区
从非托管代码中获取System.AccessViolationException?
我正在编写此库,该库通过媒体基础框架在C ++/CLI中实现了一些基本的音频播放器功能,该框将被托管代码消费.我可以播放音频,停止,暂停等.对于任何不熟悉媒体基金会的人,媒体会话发布了您可以进行通知的事件.这是通过使用iMfasynccallback对象在会话对象上调用begingetevent来完成的. Imfasynccallback定义了您应该实现的方法来处理事件的方法(iMfasyncresult).事件发生时,将通过iMfasyncresult对象的工作线程上的会话对象调用调用方法,您可以查询事件信息.此结果对象由事件线程创建和拥有. 在我实现Invoke时,每当我尝试使用我被传递的iMfasyncresult对象进行任何操作(包括调用QueryInterface或某些东西)时,我都会得到一个System.AccessVioLationException.我实现的对象Imfasynccallback是在CRT堆上分配的基本C ++类(未管理),事件发布在CRT HEAP上
2 2024-01-04
编程技术问答社区
使用VideoToolbox时,NVIDIA NVENC(媒体基金会)编码的h.264帧无法正确解码
我面临着与在这里尝试解码iPad Pro OS v14.3(我也使用 olivia stork的示例): 25%的图片数据正确解码,其余图片只是绿色. iPad Pro OS v14.3上的解码图像看起来像 this (如 a>,所以这不仅仅是显示问题). 原始图像看起来像 this . 该图像是用Windows10上的Nvidia Nvenc(媒体基金会)编码的. 我搜索了链接中所述的其他4字节NALU启动代码,但只有三个针对SP,PPS和IDR图片数据的预期. 我有另一个在Windows10上运行的媒体基础解码器应用程序,该应用程序可以正确地解码完全相同的源帧. 我正在挣扎数天,现在找到了问题的原因. 预先感谢. Rob - 编辑2021-01-11 : 我发现,Nalu类型5的IDR图片数据块中实际上还有三个三字节启动代码(0x000001). 我试图用以下数据块的长度替换这些启动代码(big endian),如在这里,
6 2023-12-17
编程技术问答社区
为什么MediaElement有时会默默地失败,我怎样才能纠正它?
在我的WPF项目中,我创建了一个视图,其中包括几个播放视频的媒体.有时,一个或全部媒体之间的任何地方都不会播放分配给他们的视频,而是显示一个黑色矩形,或者根本不会出现.发生这种情况时不会发生MediaFailed事件.即使他们不播放视频,也会在所有媒体上提起媒体活动. 我已经为我的图形卡安装了最新的驱动程序,这对此问题没有影响. 是否可以使用一个程序来确保每个媒体都始终如一地播放? 示例源代码在下面.一个完整的示例项目,其中包括视频文件在github上,网址为 https://github.com/duggungulous/mediaelementissueexame /p> mainwindow.xaml
4 2023-12-13
编程技术问答社区
如何从Windows 8现代应用程序的视频流中抓取帧?
我正在尝试从MP4视频流中提取图像.查找东西后,似乎正确的方法是使用C ++中的媒体基础并打开框架/从中读取内容. 几乎没有文档和样本的方式,但是经过一些挖掘,似乎有些人通过将框架读成纹理并将其纹理的内容复制到可读的可读纹理中,从而成功地做到了这一点(i甚至不确定我在这里是否使用正确的术语).尝试我发现的东西会给我错误,我可能在做很多事情. 这是我尝试这样做的一小部分代码(项目本身附加在底部). ComPtr spTextureDst; MEDIA::ThrowIfFailed( m_spDX11SwapChain->GetBuffer(0, IID_PPV_ARGS(&spTextureDst)) ); auto rcNormalized = MFVideoNormalizedRect(); rcNormalized.left = 0; rcNormalized
0 2023-12-10
编程技术问答社区
Debug媒体基金会
我目前正在尝试编写ByteStreamHandler和音频decoder以在Windows Store应用中添加对不支持的编解码器的支持. 我遵循 this mpeg1示例需要. 但是,我不确定它是否正确加载,因为我总是使用HRESULT E_FAIL. 我已经在代码中使用的所有E_FAIL添加了值,以找出不幸的是,它似乎没有在我的代码中发生. 现在,我想知道是否有任何方法可以找出包含ActivatableClasses的DLL是否正确加载了,以及如何在DLL中调试代码. 更多信息: 我通过将其添加到我的软件包中. MyDecoder.Windows.dll
24 2023-12-08
编程技术问答社区
使用Windows Media Foundation创建NV12编码视频
我正在学习使用此教程使用Windows Media Foundation使用此教程 http://blogs.msdn.com/b/eternalcoding/archive/archive/Archive/2013/03/03/06/developing-a-winrt-component-to-a-a-a-a-video-file-used-media-foundation.aspx 我能够创建上述链接中显示的RGB编码的WMV视频.但是我需要从图像中以NV12格式创建YUV编码的MP4视频.由于NV12使用(W x H x 3/2)为每个帧的内存缓冲区字节,因此我创建了用于图像缓冲区的缓冲区(w x H x 3/2)字节(教程中的可变'target'),并设置了一些固定的值为图像数据.然后将图像步幅设置为MFCopyImage()(ARGB使用WX4作为步幅),并将高度设置为" H".但这似乎不起作用. MF_MT_SUBTYPE设置为MFVIDEOFORMAT_NV12.
2 2023-12-08
编程技术问答社区
如何使用WRL中的Activatable类ID字符串访问自定义MFT?
链接练习:使用WRL和媒体基金会创建Windows商店应用程序 提供了自定义MFT创建的示例,并将其用作活化类.内部C#代码使用类似的激活类ID字符串引用MFT mediaCapture.AddEffectAsync(MediaStreamType.Photo, "GrayscaleTransform.GrayscaleEffect", null); MediaCapture知道字符串"GrayscaleTransform.GrayscaleEffect"的MFT. MediaCapture如何仅使用此字符串引用MFT? 我需要知道这个过程,因为我正在研究一个项目,该项目需要从图像(使用WRL)创建视频,而我遵循的开发一个winrt组件来创建视频文件使用媒体基金会.但是,在我将IMFSample> SinkWriter写入之前,我需要它通过自定义的可激活MFT类将其传递.如果我将可激活的类ID从C#传递到WRL类,我将能够引用自定义MFT吗? 因此,总而言之,如何使
2 2023-12-08
编程技术问答社区
如何将MediaCapture改为Byte[]
如何将MediaCapture更改为Windows 8.1的Windows Store应用程序中的字节[]. 来自lib: windows.media.capture.mediacapture asd = new windows.media.capture.mediacapture(); thans! 解决方案 我假设您想从相机目前看到的字节阵列中获得一个字节数组,尽管很难从您的问题中解释. Microsoft GitHub页面上有一个相关的示例,尽管它们针对Windows10.您可能有兴趣迁移项目以获取此功能. getPreviewFrame :此样本将捕获预览框架,而不是全击照片初始点.一旦拥有预览框架,它就可以编辑其上的像素. 这是相关部分: private async Task GetPreviewFrameAsSoftwareBitmapAsync() { // Get information about the previe
8 2023-12-07
编程技术问答社区
Microsoft Media Foundation网络摄像头接口
我一直在使用Microsoft Media Foundation从所有类型的网络摄像头捕获来自所有类型的网络摄像头的图像.我已经有一些代码可以与几种类型的网络摄像头连接,并且能够以不同的分辨率和格式捕获图像. 我知道,在winxp下,可以使用直接显示库更改网络摄像头的不同参数(例如白平衡,曝光时间,例如曝光时间).不幸的是,直接节目库中的接口使您可以轻松地从网络摄像头捕获单个帧成为可能,从Win7下的直接秀中删除.有人知道如何使用Microsoft Media Foundation或任何其他可以与Microsoft Media Foundation结合的库来访问这些参数? 解决方案 DirectShow在Windows 7中仍然很好(最容易检查的是从Windows SDK使用GraphEdit和AMCap).然而,媒体基金会在较早版本的Windows中缺乏基本支持. 其他解决方案 可以从WMF调用直接归档QueryInterface方法.示例代码可在 Windows
6 2023-12-07
编程技术问答社区
在Windows 7上加载视频处理器MFT时出现 "未注册类"。
我有以下com调用: IMFTransform* pMFT = NULL; HRESULT hr = CoCreateInstance(CLSID_VideoProcessorMFT, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pMFT)); 在我的开发机器上,这个呼吁CoCreateInstance成功. 但是,当我在旧的Windows 7计算机上部署它时, 对CoCreateInstance的电话失败, 我不知道为什么. 这是我显示错误的方式: _com_error err(hr); LPCTSTR hrErrMsg = err.ErrorMessage(); WCHAR msg[MAX_PATH]; StringCbPrintf(msg, sizeof(msg), L"HRESULT=0x%X, %s", errContext, hrErr, hrErrMsg); MessageBox(hwnd, msg, L"Error"
32 2023-12-07
编程技术问答社区