为Windows运行时编译和使用FFmpeg库(Windows 10或Windows8.1应用程序)
FFmpeg库可以用于Windows应用程序的开发目标Windows 10, Windows 8.1,和Windows电话8.1。下面的指南为所有受支持的目标配置(平台和体系结构)提供构建指导。每种配置都需要一组不同的工具、环境变量和下面每一节中概述的配置选项。它结束了一些实用的和潜在的不明显的信息消费FFmpeg DLL从您的应用程序。
先决条件和第一次设置说明
先决条件
- Windows 10:?Microsoft Visual Studio 2015(用VisualStudio 2015 RTM测试)
- Windows 8.1:?Microsoft Visual Studio 2013(使用MSVC 2013更新3 RTM或更高版本)
- ?MSYS 2(GNU制造环境)
- ?雅玛斯(x86汇编代码编译器)
- ?gas-preprocessor.pl(ARM组件预处理器)
Windows 10安装程序
下载和安装?Microsoft Visual Studio 2015在Windows 10机器上。
Windows 8.1设置
下载和安装?Microsoft Visual Studio 2013在Windows8.1机器上
MSYS 2设置
下载最新的MSYS 2安装程序?http://msys2.github.io/和严格遵守安装说明。从安装网页。为了在MSYS 2端继承Windows端的环境,如果有msys 2_shell.cmd,请从msys 2_shell.cmd取消注释如下:REM集MSYS 2_PATH_TYPE=继承带着设置MSYS 2_PATH_TYPE=Inherence这将允许将VisualStudio的环境变量传输到MSYS 2环境并返回。
成功安装基本MSYS 2后,获取最新的制作通过调用MSYS2shell中的以下命令进行包
pacman -S make
还有最新消息GCC包装
pacman -S gcc
重命名或删除link.exe在MSYS2 usr bin文件夹中(例如。C:\msys 64\usr\bin\link.exe)防止与MSVC发生冲突link.exe
安装perl,因为它是运行“gas-preprocessor.pl”所需的。
pacman -S perl
还安装用于配置脚本的散列
pacman -S diffutils
YASM装置
从?http://yasm.tortall.net/Download.html。您必须下载“一般用途“二进制文件而不是VS 2010的二进制文件。Win 32或Win 64二进制文件都支持为这两种体系结构输出对象文件,所以这不重要。yasm-1.3.0-win64.exe.
将下载的可执行文件重命名为yasm.exe并将其放置在您的MSYS 2路径中。例如:C:\msys 64\usr\bin\yasm.exe.
气体预处理装置
下载gas-preprocessor.plPerl脚本?https://github.com/FFmpeg/gas-preprocessor
将下载的Perl脚本放在MSYS 2路径中。例如:C:\msys 64\usr\bin\gas-preprocessor.pl
验证FFmpeg环境设置
启动VisualStudioARM交叉工具命令提示符。例如:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x86 ARM Cross Tools Command Prompt
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,通过运行以下命令,验证以下所有工具是否正确设置
$ which cl /c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/cl $ which link /c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/link $ which armasm /c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/armasm $ which yasm /usr/bin/yasm $ which cpp /usr/bin/cpp $ which gas-preprocessor.pl /usr/bin/gas-preprocessor.pl
验证工具在路径中,并指向安装MSYS 2和VisualStudio的正确位置
为了保持源树干净和平台分离,我们将让中间文件转到输出\<Platform>\<Architecture>文件夹下的FFmpeg源树我们还会让安装文件(在应用程序中链接和使用FFmpeg所需的文件)转到构建\<平台>\<体系结构>文件夹下的FFmpeg源树
Windows 10编译
Windows 10 x86
发射VS 2015 x86本机工具命令提示符。例如:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x86 Native Tools Command Prompt
在上面启动的命令提示符中设置以下环境变量
SET LIB=%VSINSTALLDIR%VC\lib\store;%VSINSTALLDIR%VC\atlmfc\lib;%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86;;%UniversalCRTSdkDir%lib\%UCRTVersion%\um\x86;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\lib\um\x86;;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\Lib\um\x86 SET LIBPATH=%VSINSTALLDIR%VC\atlmfc\lib;%VSINSTALLDIR%VC\lib; SET INCLUDE=%VSINSTALLDIR%VC\include;%VSINSTALLDIR%VC\atlmfc\include;%UniversalCRTSdkDir%Include\%UCRTVersion%\ucrt;%UniversalCRTSdkDir%Include\%UCRTVersion%\um;%UniversalCRTSdkDir%Include\%UCRTVersion%\shared;%UniversalCRTSdkDir%Include\%UCRTVersion%\winrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\Include\um;
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,导航到您的克隆FFmpeg文件夹。例如:
cd /c/ffmpeg
调用以下make命令
mkdir -p Output/Windows10/x86 cd Output/Windows10/x86 ../../../configure --toolchain=msvc --disable-programs --disable-d3d11va --disable-dxva2 --arch=x86 --enable-shared --enable-cross-compile --target-os=win32 --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0A00" --extra-ldflags="-APPCONTAINER WindowsApp.lib" --prefix=../../../Build/Windows10/x86 make make install
生成的库可以在构建/Windows 10/x86中指定的文件夹-前缀以上选项
Windows 10 x64
发射VS 2015 x86x64跨工具命令提示符。例如:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x86 x64 Cross Tools Command Prompt
在上面启动的命令提示符中设置以下环境变量
SET LIB=%VSINSTALLDIR%VC\lib\store\amd64;%VSINSTALLDIR%VC\atlmfc\lib\amd64;%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64;;%UniversalCRTSdkDir%lib\%UCRTVersion%\um\x64;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\lib\um\x64;;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\Lib\um\x64 SET LIBPATH=%VSINSTALLDIR%VC\atlmfc\lib\amd64;%VSINSTALLDIR%VC\lib\amd64; SET INCLUDE=%VSINSTALLDIR%VC\include;%VSINSTALLDIR%VC\atlmfc\include;%UniversalCRTSdkDir%Include\%UCRTVersion%\ucrt;%UniversalCRTSdkDir%Include\%UCRTVersion%\um;%UniversalCRTSdkDir%Include\%UCRTVersion%\shared;%UniversalCRTSdkDir%Include\%UCRTVersion%\winrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\Include\um;
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,导航到您的克隆FFmpeg文件夹。例如:
cd /c/ffmpeg
调用以下make命令
mkdir -p Output/Windows10/x64 cd Output/Windows10/x64 ../../../configure --toolchain=msvc --disable-programs --disable-d3d11va --disable-dxva2 --arch=x86_64 --enable-shared --enable-cross-compile --target-os=win32 --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0A00" --extra-ldflags="-APPCONTAINER WindowsApp.lib" --prefix=../../../Build/Windows10/x64 make make install
生成的库可以在构建/Windows 10/x64中指定的文件夹-前缀以上选项
如果由于Link.exe抱怨MSPDB140.dll安装了错误版本,所以链接出现错误。从管理命令提示符中运行以下命令并重新生成:
copy "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\mspdbsrv.exe" "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE"
Windows 10臂
发射VS 2015 x86 ARM交叉工具命令提示符。例如:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x86 ARM Cross Tools Command Prompt
在上面启动的命令提示符中设置以下环境变量
SET LIB=%VSINSTALLDIR%VC\lib\store\ARM;%VSINSTALLDIR%VC\atlmfc\lib\ARM;%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\arm;;%UniversalCRTSdkDir%lib\%UCRTVersion%\um\arm;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\lib\um\arm;;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\Lib\um\arm SET LIBPATH=%VSINSTALLDIR%VC\atlmfc\lib\ARM;%VSINSTALLDIR%VC\lib\ARM; SET INCLUDE=%VSINSTALLDIR%VC\include;%VSINSTALLDIR%VC\atlmfc\include;%UniversalCRTSdkDir%Include\%UCRTVersion%\ucrt;%UniversalCRTSdkDir%Include\%UCRTVersion%\um;%UniversalCRTSdkDir%Include\%UCRTVersion%\shared;%UniversalCRTSdkDir%Include\%UCRTVersion%\winrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\Include\um;
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,导航到您的克隆FFmpeg文件夹。例如:
cd /c/ffmpeg
调用以下make命令
mkdir -p Output/Windows10/ARM cd Output/Windows10/ARM ../../../configure --toolchain=msvc --disable-programs --disable-d3d11va --disable-dxva2 --arch=arm --as=armasm --cpu=armv7 --enable-thumb --enable-shared --enable-cross-compile --target-os=win32 --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WIN32_WINNT=0x0A00 -D__ARM_PCS_VFP" --extra-ldflags="-APPCONTAINER WindowsApp.lib" --prefix=../../../Build/Windows10/ARM make make install
生成的库可以在构建/Windows 10/ARM中指定的文件夹-前缀以上选项
如果您遇到链接错误,因为link.exe抱怨MSPDB140.dll安装了错误的版本。从行政命令提示符重建:
copy "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\mspdbsrv.exe" "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE"
Windows 8.1编译
Windows Store 8.1 x86(VisualStudio中的Windows 8.1 Win 32)
发射VS 2013的开发人员命令提示符
Start Menu > Visual Studio 2013 (Start Menu Folder) > Visual Studio Tools > Developer Command Prompt for VS2013
在上面已启动的命令提示符中设置以下环境变量。这些环境变量用正确的目标特定路径覆盖默认路径。
SET LIB=%VSINSTALLDIR%VC\lib\store;%VSINSTALLDIR%VC\atlmfc\lib;%WindowsSdkDir%lib\winv6.3\um\x86;; SET LIBPATH=%WindowsSdkDir%References\CommonConfiguration\Neutral;;%VSINSTALLDIR%VC\atlmfc\lib;%VSINSTALLDIR%VC\lib; SET INCLUDE=%VSINSTALLDIR%VC\include;%VSINSTALLDIR%VC\atlmfc\include;%WindowsSdkDir%Include\um;%WindowsSdkDir%Include\shared;%WindowsSdkDir%Include\winrt;;
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,导航到您的克隆FFmpeg文件夹。例如:
cd /c/ffmpeg
调用以下make命令
mkdir -p Output/Windows8.1/x86 cd Output/Windows8.1/x86 ../../../configure --toolchain=msvc --disable-programs --disable-dxva2 --arch=x86 --enable-shared --enable-cross-compile --target-os=win32 --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP -D_WIN32_WINNT=0x0603" --extra-ldflags="-APPCONTAINER" --prefix=../../../Build/Windows8.1/x86 make make install
生成的库可以在构建/Windows8.1/x86中指定的文件夹-前缀以上选项
Windows Store 8.1 x64(VisualStudio中的Windows 8.1 x64)
发射VS 2013 x64跨工具命令提示符
Start Menu > Visual Studio 2013 (Start Menu Folder) > Visual Studio Tools > VS2013 x64 Cross Tools Command Prompt
在上面已启动的命令提示符中设置以下环境变量。这些环境变量用正确的目标特定路径覆盖默认路径。
SET LIB=%VSINSTALLDIR%VC\lib\store\amd64;%VSINSTALLDIR%VC\atlmfc\lib\amd64;%WindowsSdkDir%lib\winv6.3\um\x64;; SET LIBPATH=%WindowsSdkDir%References\CommonConfiguration\Neutral;;%VSINSTALLDIR%VC\atlmfc\lib\amd64;%VSINSTALLDIR%VC\lib\amd64; SET INCLUDE=%VSINSTALLDIR%VC\include;%VSINSTALLDIR%VC\atlmfc\include;%WindowsSdkDir%Include\um;%WindowsSdkDir%Include\shared;%WindowsSdkDir%Include\winrt;;
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,导航到您的克隆FFmpeg文件夹。例如:
cd /c/ffmpeg
调用以下make命令
mkdir -p Output/Windows8.1/x64 cd Output/Windows8.1/x64 ../../../configure --toolchain=msvc --disable-programs --disable-dxva2 --arch=x86_64 --enable-shared --enable-cross-compile --target-os=win32 --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP -D_WIN32_WINNT=0x0603" --extra-ldflags="-APPCONTAINER" --prefix=../../../Build/Windows8.1/x64 make make install
生成的库可以在构建/Windows8.1/x64中指定的文件夹-前缀以上选项
WindowsStore 8.1 ARM(VisualStudio中的Windows8.1 ARM)
发射VS 2013 ARM交叉工具命令提示符
Start Menu > Visual Studio 2013 (Start Menu Folder) > Visual Studio Tools > VS2013 ARM Cross Tools Command Prompt
在上面已启动的命令提示符中设置以下环境变量。这些环境变量用正确的目标特定路径覆盖默认路径。
SET LIB=%VSINSTALLDIR%VC\lib\store\ARM;%VSINSTALLDIR%VC\atlmfc\lib\ARM;%WindowsSdkDir%lib\winv6.3\um\arm;; SET LIBPATH=%WindowsSdkDir%References\CommonConfiguration\Neutral;;%VSINSTALLDIR%VC\atlmfc\lib\ARM;%VSINSTALLDIR%VC\lib\ARM; SET INCLUDE=%VSINSTALLDIR%VC\include;%VSINSTALLDIR%VC\atlmfc\include;%WindowsSdkDir%Include\um;%WindowsSdkDir%Include\shared;%WindowsSdkDir%Include\winrt;;
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,导航到您的克隆FFmpeg文件夹。例如:
cd /c/ffmpeg
调用以下make命令
mkdir -p Output/Windows8.1/ARM cd Output/Windows8.1/ARM ../../../configure --toolchain=msvc --disable-programs --disable-d3d11va --disable-dxva2 --arch=arm --as=armasm --cpu=armv7 --enable-thumb --enable-shared --enable-cross-compile --target-os=win32 --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP -D_WIN32_WINNT=0x0603 -D__ARM_PCS_VFP" --extra-ldflags="-APPCONTAINER -MACHINE:ARM" --prefix=../../../Build/Windows8.1/ARM make make install
生成的库可以在构建/Windows8.1/ARM中指定的文件夹-前缀以上选项
WindowsPhone 8.1 x86(VisualStudio中的WindowsPhone 8.1 Win32模拟器)
发射VS 2013的开发人员命令提示符
Start Menu > Visual Studio 2013 (Start Menu Folder) > Visual Studio Tools > Developer Command Prompt for VS2013
在上面已启动的命令提示符中设置以下环境变量。这些环境变量用正确的目标特定路径覆盖默认路径。
SET LIB=%VSINSTALLDIR%VC\lib\store;%VSINSTALLDIR%VC\atlmfc\lib;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\lib\x86;; SET LIBPATH=%VSINSTALLDIR%VC\atlmfc\lib;%VSINSTALLDIR%VC\lib SET INCLUDE=%VSINSTALLDIR%VC\INCLUDE;%VSINSTALLDIR%VC\ATLMFC\INCLUDE;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include\abi;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include\mincore;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include\minwin;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include\wrl;
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,导航到您的克隆FFmpeg文件夹。例如:
cd /c/ffmpeg
调用以下make命令
mkdir -p Output/WindowsPhone8.1/x86 cd Output/WindowsPhone8.1/x86 ../../../configure --toolchain=msvc --disable-programs --disable-d3d11va --disable-dxva2 --arch=x86 --enable-shared --enable-cross-compile --target-os=win32 --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP -D_WIN32_WINNT=0x0603" --extra-ldflags="-APPCONTAINER -subsystem:console -opt:ref WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib -NODEFAULTLIB:kernel32.lib -NODEFAULTLIB:ole32.lib" --prefix=../../../Build/WindowsPhone8.1/x86 make make install
生成的库可以在构建/WindowsPhone8.1/x86中指定的文件夹-前缀以上选项
Windows Phone 8.1 ARM(Visual Studio中的Windows Phone 8.1 ARM设备)
发射VS 2013 ARM交叉工具命令提示符
Start Menu > Visual Studio 2013 (Start Menu Folder) > Visual Studio Tools > VS2013 ARM Cross Tools Command Prompt
在上面已启动的命令提示符中设置以下环境变量。这些环境变量用正确的目标特定路径覆盖默认路径。
SET LIB=%VSINSTALLDIR%VC\lib\store\ARM;%VSINSTALLDIR%VC\atlmfc\lib\ARM;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\lib\arm;; SET LIBPATH=%VSINSTALLDIR%VC\atlmfc\lib\ARM;%VSINSTALLDIR%VC\lib\ARM SET INCLUDE=%VSINSTALLDIR%VC\include;%VSINSTALLDIR%VC\atlmfc\include;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include\abi;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include\mincore;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include\minwin;%WindowsSdkDir%..\..\Windows Phone Kits\8.1\Include\wrl;
打开MSYS 2壳从上面的命令提示符(使用MSYS 2安装的正确驱动器和位置)。请注意,上面的命令shell将关闭,启动MSYS2shell可能需要一段时间。
C:\msys64\msys2_shell.cmd
在MSYS 2 shell中,导航到您的克隆FFmpeg文件夹。例如:
cd /c/ffmpeg
调用以下make命令
mkdir -p Output/WindowsPhone8.1/ARM cd Output/WindowsPhone8.1/ARM ../../../configure --toolchain=msvc --disable-programs --disable-d3d11va --disable-dxva2 --arch=arm --as=armasm --cpu=armv7 --enable-thumb --enable-shared --enable-cross-compile --target-os=win32 --extra-cflags="-MD -DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP -D_WIN32_WINNT=0x0603 -D__ARM_PCS_VFP" --extra-ldflags="-APPCONTAINER -MACHINE:ARM -subsystem:console -opt:ref WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib -NODEFAULTLIB:kernel32.lib -NODEFAULTLIB:ole32.lib" --prefix=../../../Build/WindowsPhone8.1/ARM make make install
生成的库可以在构建/WindowsPhone8.1/ARM中指定的文件夹-前缀以上选项
故障排除
使用VisualStudio构建ARM库阿玛斯ARM汇编程序需要正确设置gas-preprocessor.pl和Perl在你的MSYS 2环境。请严格按照设置指示执行。
Windows商店证书、文件I/O和其他详细信息
FFmpeg是WindowsMediaFoundation的一个很好的替代方案,它支持FFmpeg所拥有的一小部分编解码器。幸运的是,FFmpeg没有使用任何禁止的Windows或CRT API,与使用此方法构建的DLL链接的应用程序通过最新的Windows AppCertificationKit。然而,有一些重要的事情需要记住。
首先,不要忘记确保应用程序包中包含根文件夹中所有必需的FFmpeg DLL。在VisualC++项目中,应将指向根项目文件夹中FFmpeg DLL的链接包括在内,确保将“生成操作”设置为“Content”,将“复制到输出目录”设置为“始终复制”。仅仅链接到导入库是不够的。如果您要求您的用户单独安装FFmpeg DLL,您将无法通过认证。
您还需要向任何用户提供自定义文件I/O上下文。AVFormatContext而不是依靠阿维奥xxx函数,因为标准的I/O函数使用WinRT中不支持的CRT I/O。(您不会失败认证,但您的应用程序将无法访问AVFormatContext.filename成员,除非它可能位于应用程序的本地存储区)。文件I/O上下文需要初始化以指向朗读, 写,和寻觅函数,与不透明成员指向结构含IRandomAccessStream^类中使用正确的WinRT IO调用打开文件时获得的窗口::存储命名空间。(你需要一个结构举行IRandomAccessStream^,因为你不能抛出无效*到裁判柄)。你的朗读, 写,和寻觅函数应该将空洞*不透明对结构*定义,然后使用IRandomAccessStream^所有的I/O。
因为FFmpeg I/O调用是同步的,但是IRandomAccessStream成员都是异步的,您需要利用创建任务和等()在IO上下文实现函数中的所有I/O调用。请注意,这需要在工作线程上执行任何利用文件I/O的FFmpeg函数,因为如果您使用等()在UI线程中。这里的最佳解决方案是创建您将使用的主要ffmpeg函数的winrt友好包装函数,方法是使用并发性::CREATE异步职能,例如:
IAsyncOperation<int>^ av_read_frame_async(AVFormatContext* s, AVPacket* pkt) { return create_async([s, pkt]()->int { return av_read_frame(s, pkt); }); }
或者,如果您不想使用Windows运行时扩展,也不介意COM,则可以使用Windows 8-API函数。CreateStreamOverRandomAccessStream,这给了你一个iStream*组件的COM接口。IRandomAccessStream^,使用同步I/O,并且可以作为空洞*不透明IO上下文的成员。这个iStreamI/O调用更易于在C++中使用,因为它们支持直接指针缓冲区访问(您不必处理IBuffer)和更紧密地对应于AVIOContext。但是,您仍然应该确保在后台线程中包装任何利用文件I/O的代码,因为过度阻塞UI确实违反了Windows Store准则,并可能导致应用程序在运行时终止。
验证已构建的FFmpeg库和示例应用程序
从上述编译中生成的FFmpeg库可以由Windows运行时组件或应用程序。可以在以下项目中对照Interop组件和示例媒体播放器对它们进行测试: