gpt4 book ai didi

python - Windows Media Foundation 解码音频流

转载 作者:太空宇宙 更新时间:2023-11-03 19:40:46 25 4
gpt4 key购买 nike

我是 Windows Media Foundation 的新手,目前正在学习一些有关入门和解码音频的基础知识的教程。但是,我遇到了一些问题。使用:Windows 10 64位(1809),并使用Python(ctypes和COM接口(interface))。

1) IMFSourceReader 不允许我选择或取消选择任何流输出。我尝试过 wav 和 mp3 格式(以及多个不同的文件),但它们都出错了。根据文档,为了提高性能,您需要取消选择其他流并选择所需的流,在本例中为音频。

但是:source_reader.SetStreamSelection(MF_SOURCE_READER_ANY_STREAM, False)

产生错误:OSError:[WinError -1072875853]提供的流编号无效。

由于 MF_SOURCE_READER_ANY_STREAM 值(DWORD 4294967294)应该是通用的,因此哪个应该是正确的?还是我的说法不正确?

我尝试看看是否可以只选择音频流:source_reader.SetStreamSelection(MF_SOURCE_READER_FIRST_AUDIO_STREAM, True)

这会产生不同的错误:OSError:异常:访问冲突读取 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 对于其他功能似乎运行良好,例如 GetCurrentMediaTypeSetCurrentMediaType 等。它是否仍返回 IMFSourceReader是否有任何问题?

2)我不确定无法选择流是否会导致进一步的问题(我怀疑是这样)。如果我只是跳过选择或取消选择流,那么一切实际上都会正常进行,直到尝试使用 ConvertToContigouslyBuffer 将样本转换为单个缓冲区,根据文档,该缓冲区输出到 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 的首选吗?我应该使用其他东西吗?我真的很困惑,非常感谢任何帮助。

最佳答案

尝试使用 MF_SOURCE_READER_ALL_STREAMS 而不是 MF_SOURCE_READER_ANY_STREAM

source_reader.SetStreamSelection(MF_SOURCE_READER_ALL_STREAMS, False) 

在阅读示例时,您还需要指定有效的流索引,在您的情况下,我怀疑 0 不是。尝试:

source_reader.ReadSample((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, None, ctypes.byref(flags), None, ctypes.byref(sample))

当您进行媒体基础调用时,您的 Python 包装器是否返回结果?几乎所有 Media Foundation 方法都会返回 HRESULT,在继续操作之前检查它是否等于 S_OK 非常重要。如果不这样做,就很难找出错误的调用发生在哪里。

Is WMF still the goto for Windows 10?

很多人问that question 。答案取决于您需要做什么(在您的情况下,音频编解码器支持非常有限,因此可能不是最佳选择)。但对于渲染音频/视频、读取/写入媒体文件、音频/视频设备捕获等操作,Media Foundation 仍然是 Microsoft 支持的最新选项。

关于python - Windows Media Foundation 解码音频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60439594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com