Xamarin Android 播放器 - 无法播放此视频
Xamarin Android Player - Can't play this video
我正在使用 Android 的 VideoView 在我的应用程序中播放嵌入式视频。它在我的设备上运行良好,但我在 Xamarin Android 播放器中不断收到 "Can't play this video" 消息和黑屏。
相应的错误日志如下所示:
Unable to play video
[MediaPlayer] Error (1,-38)
[VideoView] Error: 1,-38
我找到了一些关于此错误的帖子,但其中 none 帮助我解决了这个问题,但我找不到此状态代码的正确描述。
我的 C# 代码如下所示:
videoView = new VideoView (Context);
base.SetNativeControl (videoView);
videoView.SetOnErrorListener (new ErrorListener ());
string fileName = e.NewElement.FileSource;
fileName = fileName.ToLower ().Substring (0, fileName.LastIndexOf ("."));
int resourceID = Context.Resources.GetIdentifier (fileName, "raw", Context.PackageName);
var fullPath = String.Format ("android.resource://{0}/{1}", Context.PackageName, resourceID);
videoView.SetVideoPath (fullPath);
videoView.RequestFocus ();
videoView.Start ();
模拟器支持的编码类型似乎有问题,如果你安装 ffmpeg,如果你在 mac 上通过 运行 这些命令:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install ffmpeg
然后使用以下方法处理您的视频文件:
ffmpeg -i big_buck_bunny_720p_1mb.mp4 -c:v libx264 -profile:v baseline -c:a aac -strict -2 -b:a 128k output.mp4
并尝试播放它不会显示该错误的输出,但它将是一个空白视频(只是一个黑屏)。所以我认为问题只是获得正确的编码,尝试了一些不同的编码但似乎都显示黑屏。
将进行更多挖掘,但目前看来只是模拟器不支持您的编码。
编辑
好的,我开始播放视频了,我用以下方法处理了视频:
ffmpeg -i SampleVideo_1080x720_1mb.mp4 -codec:v libx264 -profile:v baseline -preset slow -b:v 250k -maxrate 250k -bufsize 500k -vf scale=-1:360 -threads 0 -codec:a aac -strict -2 -b:a 96k output.mp4
检查此 site 以获得 ffmpeg 参数。
我这样设置 VideoView
:
public class Activity1 : Activity
{
VideoView videoView;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
videoView = FindViewById<VideoView> (Resource.Id.SampleVideoView);
videoView.SetMediaController(new MediaController(this));
videoView.SetVideoPath ($"android.resource://{PackageName}/{Resource.Raw.output}");
videoView.RequestFocus ();
videoView.Start ();
}
}
这似乎适用于 Xamarin Android 播放器,但仅适用于 API 版本 16(JellyBean) 和 19(Kitkat)。 21(棒棒糖)只是没有加载视频。
然后我下载了 GenyMotion Emulator(需要创建一个帐户,但个人使用是免费的)来检查它是否是 Xamarin Player。它适用于除 21(棒棒糖)以外的所有 (16,17,18,19,20 + 22)。看起来 21 的模拟器有问题,我在 nexus 4 模拟器上做了所有测试。因此,如果您想播放视频,我会尽量避免使用 API 21.
的模拟器
不同的Android OS 版本支持视频容器内不同的音频和视频编码组合。所以这取决于您的 Android Player 正在模拟的版本。对于 table,请参阅 http://developer.android.com/guide/appendix/media-formats.html#core
我正在使用 Android 的 VideoView 在我的应用程序中播放嵌入式视频。它在我的设备上运行良好,但我在 Xamarin Android 播放器中不断收到 "Can't play this video" 消息和黑屏。
相应的错误日志如下所示:
Unable to play video
[MediaPlayer] Error (1,-38)
[VideoView] Error: 1,-38
我找到了一些关于此错误的帖子,但其中 none 帮助我解决了这个问题,但我找不到此状态代码的正确描述。
我的 C# 代码如下所示:
videoView = new VideoView (Context);
base.SetNativeControl (videoView);
videoView.SetOnErrorListener (new ErrorListener ());
string fileName = e.NewElement.FileSource;
fileName = fileName.ToLower ().Substring (0, fileName.LastIndexOf ("."));
int resourceID = Context.Resources.GetIdentifier (fileName, "raw", Context.PackageName);
var fullPath = String.Format ("android.resource://{0}/{1}", Context.PackageName, resourceID);
videoView.SetVideoPath (fullPath);
videoView.RequestFocus ();
videoView.Start ();
模拟器支持的编码类型似乎有问题,如果你安装 ffmpeg,如果你在 mac 上通过 运行 这些命令:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install ffmpeg
然后使用以下方法处理您的视频文件:
ffmpeg -i big_buck_bunny_720p_1mb.mp4 -c:v libx264 -profile:v baseline -c:a aac -strict -2 -b:a 128k output.mp4
并尝试播放它不会显示该错误的输出,但它将是一个空白视频(只是一个黑屏)。所以我认为问题只是获得正确的编码,尝试了一些不同的编码但似乎都显示黑屏。
将进行更多挖掘,但目前看来只是模拟器不支持您的编码。
编辑
好的,我开始播放视频了,我用以下方法处理了视频:
ffmpeg -i SampleVideo_1080x720_1mb.mp4 -codec:v libx264 -profile:v baseline -preset slow -b:v 250k -maxrate 250k -bufsize 500k -vf scale=-1:360 -threads 0 -codec:a aac -strict -2 -b:a 96k output.mp4
检查此 site 以获得 ffmpeg 参数。
我这样设置 VideoView
:
public class Activity1 : Activity
{
VideoView videoView;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
videoView = FindViewById<VideoView> (Resource.Id.SampleVideoView);
videoView.SetMediaController(new MediaController(this));
videoView.SetVideoPath ($"android.resource://{PackageName}/{Resource.Raw.output}");
videoView.RequestFocus ();
videoView.Start ();
}
}
这似乎适用于 Xamarin Android 播放器,但仅适用于 API 版本 16(JellyBean) 和 19(Kitkat)。 21(棒棒糖)只是没有加载视频。
然后我下载了 GenyMotion Emulator(需要创建一个帐户,但个人使用是免费的)来检查它是否是 Xamarin Player。它适用于除 21(棒棒糖)以外的所有 (16,17,18,19,20 + 22)。看起来 21 的模拟器有问题,我在 nexus 4 模拟器上做了所有测试。因此,如果您想播放视频,我会尽量避免使用 API 21.
的模拟器不同的Android OS 版本支持视频容器内不同的音频和视频编码组合。所以这取决于您的 Android Player 正在模拟的版本。对于 table,请参阅 http://developer.android.com/guide/appendix/media-formats.html#core