ffmpeg windows config win32/win64 compile

为Windows运行时编译和使用FFmpeg库(Windows 10或Windows8.1应用程序)

FFmpeg库可以用于Windows应用程序的开发目标Windows 10Windows 8.1,和Windows电话8.1。下面的指南为所有受支持的目标配置(平台和体系结构)提供构建指导。每种配置都需要一组不同的工具、环境变量和下面每一节中概述的配置选项。它结束了一些实用的和潜在的不明显的信息消费FFmpeg DLL从您的应用程序。


先决条件和第一次设置说明

先决条件

 

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.plPerl在你的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组件和示例媒体播放器对它们进行测试:

​https://github.com/Microsoft/FFmpegInterop

posted @ 2020-07-05 13:10  YZFHKMS-X  阅读(627)  评论(0编辑  收藏  举报