【发布时间】:2020-02-27 18:29:04
【问题描述】:
我是 Windows Media Foundation 的新手,我目前正在学习一些关于入门和解码音频的基础教程。但是,我遇到了一些问题。使用:Windows 10 64bit (1809),并且正在使用 Python(ctypes 和 COM 的接口)。
1) IMFSourceReader 不允许我选择或取消选择任何输出流。我尝试过 wav 和 mp3 格式(以及多个不同的文件),但它们都出错了。根据文档,为了提高性能,您需要取消选择其他流并选择所需的流,在本例中为音频。
但是:
source_reader.SetStreamSelection(MF_SOURCE_READER_ANY_STREAM, False)
产生错误:
OSError: [WinError -1072875853] The stream number provided was invalid.
哪个应该是正确的,因为MF_SOURCE_READER_ANY_STREAM 值(4294967294 的 DWORD)应该是通用的?还是我说的不对?
我试过看看是否可以只选择音频流:
source_reader.SetStreamSelection(MF_SOURCE_READER_FIRST_AUDIO_STREAM, True)
这会产生不同的错误:
OSError: exception: access violation reading 0x0000000000000001
到目前为止我的当前代码:
MFStartup(MF_VERSION) # initialize
source_reader = IMFSourceReader()
filename = "C:\\test.mp3"
MFCreateSourceReaderFromURL(filename, None, ctypes.byref(source_reader)) # out: source reader.
if source_reader: # Not null
source_reader.SetStreamSelection(MF_SOURCE_READER_ANY_STREAM, False) # invalid stream #?
source_reader.SetStreamSelection(MF_SOURCE_READER_FIRST_AUDIO_STREAM, True) # access violation??
IMFSourceReader 似乎在其他功能上运行良好,例如GetCurrentMediaType、SetCurrentMediaType 等。如果有任何问题,它还能返回IMFSourceReader吗?
2) 我不确定无法选择流是否会导致进一步的问题(我怀疑是这样)。如果我只是跳过选择或取消选择流,那么一切都会正常运行,直到尝试使用ConvertToContiguousBuffer 将样本转换为单个缓冲区,根据文档,该缓冲区输出到IMFMediaBuffer。问题是,在运行之后,它确实返回为S_OK,但缓冲区是null。我使用GetBufferCount 来确保样本中至少有一些缓冲区,并且根据使用的文件,它总是返回 1-3,所以它不应该为空。
以下是相关代码:
while True:
flags = DWORD()
sample = IMFSample()
source_reader.ReadSample(streamIndex, 0, None, ctypes.byref(flags), None, ctypes.byref(sample)) # flags, sample [out]
if flags.value & MF_SOURCE_READERF_ENDOFSTREAM:
print("READ ALL OF STREAM")
break
if sample:
buffer_count = DWORD()
sample.GetBufferCount(ctypes.byref(buffer_count))
print("BUFFER COUNT IN SAMPLE", buffer_count.value)
else:
print("NO SAMPLE")
continue
buffer = IMFMediaBuffer()
hr = sample.ConvertToContiguousBuffer(ctypes.byref(buffer))
print("Conversion succeeded", hr == 0) # true
if buffer:
print("CREATED BUFFER")
else:
print("BUFFER IS NULL")
break
我不确定从这里去哪里,我在互联网上找不到关于这些具体问题的太多解释。 WMF 仍然是 Windows 10 的首选吗?我应该使用别的东西吗?我真的很难过,非常感谢任何帮助。
【问题讨论】:
-
我觉得
SetStreamSelection没问题,可能这个方法的 Python 绑定坏了。 -
这是正确的,在 Python com 中,您必须具有头文件中列出的方法的确切顺序,否则它将不起作用。它们没有正确排列,并且根据版本删除/添加了一些方法。一旦我解决了这个问题,它就开始工作了。谢谢。
标签: python windows audio decode ms-media-foundation