【问题标题】:Xamarin Android Player - Can't play this videoXamarin Android 播放器 - 无法播放此视频
【发布时间】:2015-10-09 12:31:57
【问题描述】:

我正在使用 Android 的 VideoView 在我的应用中播放嵌入的视频。它在我的设备上运行良好,但在 Xamarin Android 播放器中不断收到“无法播放此视频”消息和黑屏。

对应的错误日志如下所示:

Unable to play video
[MediaPlayer] Error (1,-38)
[VideoView] Error: 1,-38

我发现了一些关于这个错误的帖子,但没有一个可以帮助我解决这个问题,而且我找不到这个状态代码的正确描述。

我的 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 ();

【问题讨论】:

  • 您的视频是什么格式的? mp4?
  • 是的,格式是mp4

标签: android xamarin android-emulator android-mediaplayer android-videoview


【解决方案1】:

如果您安装 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 模拟器(需要创建一个帐户,但个人免费使用)来检查它是否是 Xamarin 播放器。它适用于除 21(棒棒糖)之外的所有(16、17、18、19、20 + 22)。看起来 21 的模拟器有问题,我在 nexus 4 模拟器上进行了所有测试。因此,如果您想测试视频播放,我会尽量避免使用 API 21 的模拟器。

【讨论】:

  • 处理完视频后,它在我的 Mac 上可以正常播放,但在模拟器上,它只会产生您所描述的黑屏。至少错误消息消失了。知道 Xamarin Android 播放器支持哪种编码吗?干杯!
  • 是的,在我的机器上也一样,不太确定支持哪些,这个问题stackoverflow.com/a/4910269/1107580 似乎认为它的 H.263。将尝试使用它对其进行编码,看看它是否播放
  • 我以前看过那篇文章并尝试过 H.263 编码,但没有任何运气。但也可以随意尝试一下。
  • 试过 H.263 但还是黑屏。注意到有些人说他们可以播放视频,但速度很慢。此外,浏览器似乎能够在模拟器上播放视频,但我认为这没有使用 videoview
  • 我使用您在 EDIT 中发布的命令处理了我的视频。事实上,我只需要使用基线配置文件来处理它:ffmpeg -i intro.mp4 -profile:v baseline output.mp4。我现在可以在 API 16 上播放视频,但在 API 21 上仍然会出现黑屏和错误消息。您认为这会导致物理设备出现问题吗?如果没有,我会继续忽略它在模拟器上不起作用。干杯!
【解决方案2】:

不同的 Android 操作系统版本支持视频容器内不同的音频和视频编码组合。所以这取决于你的安卓播放器正在模拟什么版本。表格见http://developer.android.com/guide/appendix/media-formats.html#core

【讨论】:

  • 我之前看过该表,根据所描述的媒体格式,它应该可以在我的模拟器上运行(运行 Lollipop API 22)。我尝试播放的视频使用 H.264 AVC 编码和 mp4 容器格式。好奇 xamarin android 播放器本身是否存在某种限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
相关资源
最近更新 更多