最简单的基于FFmpeg的移动端例子:Windows Phone HelloWorld

=====================================================

最简单的基于FFmpeg的移动端例子系列文章列表:

最简单的基于FFmpeg的移动端例子:Android HelloWorld

最简单的基于FFmpeg的移动端例子:Android 视频解码器

最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版

最简单的基于FFmpeg的移动端例子:Android 推流器

最简单的基于FFmpeg的移动端例子:Android 视频转码器

最简单的基于FFmpeg的移动端例子附件:Android 自带播放器

最简单的基于FFmpeg的移动端例子附件:SDL Android HelloWorld

最简单的基于FFmpeg的移动端例子:IOS HelloWorld

最简单的基于FFmpeg的移动端例子:IOS 视频解码器

最简单的基于FFmpeg的移动端例子:IOS 推流器

最简单的基于FFmpeg的移动端例子:IOS 视频转码器

最简单的基于FFmpeg的移动端例子附件:IOS自带播放器

最简单的基于FFmpeg的移动端例子:Windows Phone HelloWorld

=====================================================

本文记录Windows Phone平台下基于FFmpeg的HelloWorld程序。该示例C语言的源代码来自于《最简单的基于FFMPEG的Helloworld程序》。相关的概念就不再重复记录了。

由于在FFmpeg移动端开发方面只有Android和IOS的实战经验,所以我一开始的时候只做了Android和IOS的示例程序。前两天要参加微软的Windows 10发布会,会前浏览信息的时候发现Windows 10在视音频处理方面已经加入了对FFmpeg的原生支持。同时微软还公布了一个开源项目FFmpegInterop,专门用于给Windows 8.1/10 App编译包含FFmpeg功能的类库。出于好奇我便下载并捣鼓了一下FFmpegInterop这个工程,最终总结了一个FFmpeg在Windows Phone 平台的HelloWorld的示例程序。

Windows Phone平台下使用FFmpeg类库的说明

Windows Phone平台(Windows App Store,Windows应用商店)使用FFmpeg类库的流程如下所示。

1.编译FFmpeg类库

(1)前提需要安装VS2013和MSYS2(最好已经可以成功使用这两个工具编译PC上使用的FFmpeg)。

(2)获得FFmpegInterop工程(该工程位于Github上面,地址为https://github.com/Microsoft/FFmpegInterop)。

(3)加入FFmpeg源代码。从官网上下载源代码后,将源代码解压到FFmpegInterop的ffmpeg目录下。

(4)以管理员的身份启动“VS2013 开发人员命令提示”控制台,切换到FFmpegInterop目录。

(5)配置MSYS2,运行下面命令设置MSYS2_BIN环境变量(这里根据MSYS2的安装路径不同而不同):set MSYS2_BIN="E:\msys64\usr\bin\bash.exe"

(6)处理一个小Bug。需要把MSYS2中的link.exe改个名字(随便改一个即可,例如“link_msys.exe”)。由于MSYS2中的link.exe和VS2013中的link.exe重名了,如果不改名字的话会系统就会错误地使用MSYS2的link.exe(而不是VS2013的link.exe),从而导致编译失败。不知道是不是所有的机子都有这个问题,当时确实卡了我一段时间。

(7)执行命令编译类库。直接执行BuildFFmpeg.bat会打印帮助菜单。执行下面这条语句就可以编译Windows8.1 x86平台的类库。编译成功后的类库位于“ffmpeg\Build\Windows8.1\x86”目录下。BuildFFmpeg win8.1 x86执行下面的语句会同时编译Windows8.1 x86和x64平台的类库。BuildFFmpeg win8.1 x86 x64其它的编译命令不再详述,可以查看帮助菜单。本步骤获得的FFmpeg类库就可以用于Windows App Store程序的开发了。PS:这里生成的dll与平时用于控制台或者MFC程序中的dll是不一样的。这里的dll是加了AppContainer 的flag的dll。如果使用普通的控制台程序调用这里生成的dll,就会报错“0xc000a200”:Error 0xc000a200: shows up when regular process (not inside an AppContainer) tries to load DLL that was marked with AppContainer flag。(8)打开samples文件夹下的sln解决方案[可选]。这一步sln解决方案中包含了FFmpegInterop库源代码工程以及一些示例程序。这部分的源代码还没有细看(本文暂不涉及这部分代码的内容)。2.编写Windows Phone平台下的程序

(1)新建一个“Windows应用商店”程序。位于“文件->新建->项目->Visual C++->Windows应用商店->空白应用程序(XAML)”。

(2)将编译后的类库拷贝至该项目目录下(注意x86、x64等这些平台要对应)。新建include文件夹存储头文件(*.h);lib文件夹存储导入库文件(*.lib);并将动态库文件(*.dll)直接拷贝至目录下。

(3)配置类库。分成以下3步:a)头文件配置解决方案资源管理器->右键单击项目->属性面板属性面板->C/C++->常规->附加包含目录,输入“include”(刚才拷贝头文件的目录)b)导入库配置属性面板->链接器->常规->附加库目录,,输入“lib”(刚才拷贝库文件的目录)属性面板->链接器->输入->附加依赖项,输入“avcodec.lib; avformat.lib; avutil.lib; avdevice.lib; avfilter.lib; swresample.lib; swscale.lib”(导入库的文件名)c)动态库配置(重要而有特色的一步)解决方案资源管理器->右键单击项目->添加->现有项,将dll文件添加进来选中每个dll文件->右键单击->属性->常规->内容,设定为“是”(4)测试a)编辑界面在MainPage.xaml中添加一个Button按钮,并添加一个“Button_Clicked()”响应函数。<Pagex:Class="testApp.MainPage"xmlns=""xmlns:x=""xmlns:local="using:testApp"xmlns:d=""xmlns:mc=""mc:Ignorable="d"><StackPanel Margin="120,30,0,0"><TextBlock HorizontalAlignment="Left" Text="My FFmpeg test" FontSize="36"/><Button Content="Configure Info" Click="Button_Clicked"/><TextBlock x:Name="greetingOutput"/></StackPanel></Page>b)编辑代码在MainPage.xaml.cpp中添加一个Button_Clicked()的代码,如下所示。void MainPage::Button_Clicked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e){//greetingOutput->Text = "Hello, Lei";USES_CONVERSION;String ^info = ref new String(A2W(avcodec_configuration()));Windows::UI::Popups::MessageDialog(info).ShowAsync();}该代码调用了avcodec_configuration()获取FFmpeg类库的配置信息,然后调用MessageDialog()弹出一个对话框显示这些信息。注意其中使用了atlconv.h中的一个A2W()的宏,用于把char *转换为Platform::String。在MainPage.xaml.cpp头部添加用到的头文件,如下所示。#include <atlconv.h>extern "C"{#include "libavcodec/avcodec.h"}在MainPage.xaml.h添加响应函数的声明,如下所示。public ref class MainPage sealed{public:MainPage();void Button_Clicked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);};如果一切配置都没有问题的话,Windows App的运行结果如下图所示。单击左上角的按钮就会弹出FFmpeg类库的配置信息。德高培身,财多伤身。

最简单的基于FFmpeg的移动端例子:Windows Phone HelloWorld

相关文章:

你感兴趣的文章:

标签云: