Xamarin Android Player - невозможно воспроизвести это видео

Я использую Android VideoView для воспроизведения встроенного видео в своем приложении. Он отлично работает на моем устройстве, но я продолжаю получать сообщение "Не могу воспроизвести это видео" и черный экран в Android-плеере Xamarin.

error message

Соответствующий журнал ошибок выглядит следующим образом:

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

Я нашел несколько сообщений об этой ошибке, но никто из них не помог мне решить эту проблему, и я не могу найти правильное описание этого кода состояния.

Мой код С# выглядит следующим образом:

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

Ответ 1

Кажется, проблема с типом кодировки, которую поддерживает эмулятор, если вы устанавливаете ffmpeg, если вы на макете, выполнив следующие команды:

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

Отметьте сайт для параметров 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 Player, но только для версий API 16 (JellyBean) и 19 (Kitkat). 21 (леденец) просто не загружает видео.

Затем я загрузил эмулятор GenyMotion (нужно создать учетную запись, но ее бесплатно для личного использования), чтобы проверить, был ли это Xamarin Игрок или нет. Он работает на всех (16,17,18,19,20 + 22), кроме 21 (леденец). похоже, что что-то не так с эмуляторами для 21, я сделал все мои тесты на эмуляторах nexus 4. Поэтому, если вы хотите воспроизвести видео, я бы попытался избежать эмуляторов с API 21.

Ответ 2

Различные версии ОС Android поддерживают различные комбинации кодировок аудио и видео в видеоконтейнере. Таким образом, это зависит от того, какую версию подражает Android-плеер. Для таблицы см. http://developer.android.com/guide/appendix/media-formats.html#core