None of the available extractors could read the stream как исправить

hello, i have a video file here: https://images2.bestjlb.com/jlbapp/5e09875981b2214e548f2eb09aac0e48/2020/05/v2jlbosscddf49b7d06c8d44b75253ec14b8987c(540x960)(7407ms).mp4 . This video was recorded ...

hello, i have a video file here:
https://images2.bestjlb.com/jlbapp/5e09875981b2214e548f2eb09aac0e48/2020/05/v2jlbosscddf49b7d06c8d44b75253ec14b8987c(540×960)(7407ms).mp4 .

This video was recorded by an android phone and played well in the system album.
It can play well on Chrome browser and iPhone, Ubuntu Laptop,
but failed to play on any android phones through ExoPlayer (Version: 2.10.8).

Exception got here:

05-09 17:50:42.505 24563 24563 W System.err: com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, AmrExtractor, Ac4Extractor) could read the stream.
05-09 17:50:42.505 24563 24563 W System.err: at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:386)
05-09 17:50:42.505 24563 24563 W System.err: at android.os.Handler.dispatchMessage(Handler.java:103)
05-09 17:50:42.505 24563 24563 W System.err: at android.os.Looper.loop(Looper.java:213)
05-09 17:50:42.505 24563 24563 W System.err: at android.os.HandlerThread.run(HandlerThread.java:67)
05-09 17:50:42.505 24563 24563 W System.err: Caused by: com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, AmrExtractor, Ac4Extractor) could read the stream.
05-09 17:50:42.505 24563 24563 W System.err: at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractorHolder.selectExtractor(ProgressiveMediaPeriod.java:1074)
05-09 17:50:42.505 24563 24563 W System.err: at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:952)
05-09 17:50:42.505 24563 24563 W System.err: at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:394)
05-09 17:50:42.505 24563 24563 W System.err: at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
05-09 17:50:42.505 24563 24563 W System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
05-09 17:50:42.505 24563 24563 W System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
05-09 17:50:42.505 24563 24563 W System.err: at java.lang.Thread.run(Thread.java:929)

Я создаю приложение Flutter, которое берет список URL-адресов видеоклипов из Firebase, загружает их в хранилище и сохраняет пути к файлам. После этого пользователь может просмотреть список путей к видео и воспроизвести видеоклипы, которые были загружены. Это делается с помощью Flutter video_player.

ПРОБЛЕМА

Это должно быть довольно просто, но по какой-то причине некоторые видеоклипы не могут быть загружены и воспроизведены с помощью VideoPlayerController. Все видеоклипы имеют один и тот же формат, одинаково обработаны, сжаты и загружены.

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

var dir = await getApplicationDocumentsDirectory();
String filePath = "video/$index.mp4";
String fullPath = dir.path + filePath;
Response videoResponse = await dio.download(videoUrl, fullPath);

if (videoResponse.statusCode == 200) {
      videoPath = fullPath;
      print("Downloaded: $filePath");
    } else {
      print("Download error")
    }

Затем videoPath будет сохранен в списке и отправлен на экран, содержащий видеоплеер.

Внутри экрана видеопроигрывателя вот как он загружает видеоклипы из файла:

_controller = VideoPlayerController.file(
    new File(videos[index].videoPath));

_initPlayerFuture = _controller.initialize();

Этот код будет использовать index для переключения между каждым файлом в списке.

Когда я запускаю это, около 50% клипов загружаются и воспроизводятся безупречно, в то время как другие возвращают следующую ошибку в журнале:

E/ExoPlayerImplInternal(27253): Source error.
E/ExoPlayerImplInternal(27253): com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, AmrExtractor) could read the stream.
E/ExoPlayerImplInternal(27253):     at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractorHolder.selectExtractor(ExtractorMediaPeriod.java:973)
E/ExoPlayerImplInternal(27253):     at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:891)
E/ExoPlayerImplInternal(27253):     at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:381)
E/ExoPlayerImplInternal(27253):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/ExoPlayerImplInternal(27253):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/ExoPlayerImplInternal(27253):     at java.lang.Thread.run(Thread.java:764)

Кажется, я изолировал проблему от способа сохранения видеоклипов в хранилище (см. ПРИМЕЧАНИЯ), но это не объясняет, почему одни клипы работают, а другие — нет.

Кто-нибудь знает, что может происходить, и как это исправить? Или у кого-нибудь была такая же проблема, и может быть, у кого-нибудь есть опыт, которым можно поделиться?

Заранее спасибо!

< Сильный > ПРИМЕЧАНИЯ

  • Всякий раз, когда я пропускаю процесс загрузки в хранилище и просто использую VideoPlayerController.network(videos[index].videoUrl) все , видео будет воспроизводиться без каких-либо проблем. Однако важно, чтобы все видеоклипы вначале загружались одновременно.

  • Каждый раз одни и те же клипы либо работают, либо нет, и не имеет значения, в каком положении они находятся.

  • Я проверил все пути, отправляемые в VideoPlayerController, и все они правильно сохранены и переданы видеопроигрывателю.

  • Может быть связано с этим сообщением: Flutter video_player не воспроизводит видео сохранено в каталоге приложения

I am using ExoPlayer to stream videos in a RecyclerView.

I am implementing the ExoPlayer inside my RecyclerView Adapter’s bind method inside my ViewHolder.

The video format I am using is m3u8 and the URL I am using works in a browser.
So I know that the video link is valid. I’ve also testing a youtube link in there.

Here is the code from the Recyclerview adapter’s ViewHolder ->

class ViewHolder private constructor(val binding: FeedRowBinding) :
    RecyclerView.ViewHolder(binding.root) {

    fun bind(context: Activity){
        if (entity.content.videolink != null) {
            setupVideoPlayer(entity.content.videolink, context)
        }
    }
}

private fun setupVideoPlayer(url: String, context: Activity) {
    val videoExoPlayer = SimpleExoPlayer.Builder(binding.videoView.context).build()
    videoExoPlayer.prepare(createUrlMediaSource(url, context))

    binding.play.setOnClickListener {
        videoExoPlayer.playWhenReady = true
    }

    binding.pause.setOnClickListener {
        videoExoPlayer.playWhenReady = false
    }
}

private fun createUrlMediaSource(url: String, context: Activity): MediaSource {
    val userAgent = Util.getUserAgent(context, context.getString(R.string.about))
    return ProgressiveMediaSource
           .Factory(DefaultDataSourceFactory(context, userAgent), DefaultExtractorsFactory())
           .createMediaSource(Uri.parse(url))
}

When loading my recyclerview and get to the row with the video I get the following error:

ExoPlayerImplInternal: Source error.
com.google.android.exoplayer2.source.UnrecognizedInputFormatException:
None of the available extractors (MatroskaExtractor,
FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor,
Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor,
WavExtractor, AmrExtractor, Ac4Extractor, FlacExtractor) could read
the stream.
at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractorHolder.selectExtractor(ProgressiveMediaPeriod.java:1090)
at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:969)
at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

I’m not sure what am I doing wrong, any ideas on how to fix this issue?

Summary

On android if the file type is not at the end of the uri string expo-av doesn’t know what video extractor to use.

In my use case we add a query string JWT to the end of a video for security of the video asset. This disrupts how Expo-AV reads file type.

https://stream.mux.com/QJEvayiCDLkkPP8n28sczqHKK9NVtJhi9URXOaeIXT00.m3u8?token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlpKQVVJMUg3dG0zS3dzdzVWVW5hVlJCamlRbjAyMlZtMDFVTTk0eHNKVTAwOEEifQ.eyJleHAiOjE2NDk5NTU1NDgsImF1ZCI6InYiLCJzdWIiOiJRSkV2YXlpQ0RMa2tQUDhuMjhzY3pxSEtLOU5WdEpoaTlVUlhPYWVJWFQwMCJ9.MTfacvxT5h9sw_icpMVVMpgseTK0XdJp4DHM13BaB2R1uuDQMFL9WoFdY3Lzb0WA3C-RP_mOZpl4lbeItO1Wi7p6eiAFIEh31pOZDl0dDxXbNTPrUkTR9vfcuTYmD0z-wxvPg6suaEJOOo5pN4Uy8rGGofCb3ndrw_FXlWNqSelFyTPPFHUWxBRMC9vTtm5XXuecvd8nXOKNCw1xr7Igq-qohozEK2jNzBKjdqltdb-8L-qJX5dBcwD_fXQSgl65-bH_qMoJlP4kA0zODszfWlarZwFgb9OxE5PMeSZl6MrtgznIM3vfgz3N_FN7hqzxRzmLKox3BVHW_DzjEkzH_w

[Unhandled promise rejection: Error: h.f.c.d.q0.f0: None of the available extractors (e, g, i, e, g, e, d0, c, d, w, b, b) could read the stream.]

Please add a way for me to tell the player what type of video is being played instead of trying to parse a uri string.

Managed or bare workflow? If you have ios/ or android/ directories in your project, the answer is bare!

managed

What platform(s) does this occur on?

Android

SDK Version (managed workflow only)

«expo»: «^44.0.0»,

Environment

expo-env-info 1.0.2 environment info:
System:
OS: Windows 10 10.0.22000
Binaries:
Node: 16.14.0 — C:Program Filesnodejsnode.EXE
npm: 8.3.1 — C:Program Filesnodejsnpm.CMD
IDEs:
Android Studio: Version 2021.1.0.0 AI-211.7628.21.2111.8193401
npmPackages:
babel-preset-expo: 9.0.2 => 9.0.2
expo: ^44.0.0 => 44.0.6
react: 17.0.1 => 17.0.1
react-dom: 17.0.1 => 17.0.1
react-native: 0.64.3 => 0.64.3
react-navigation: ^4.4.4 => 4.4.4
Expo Workflow: managed

Reproducible demo

snack

in the snack example i put three video views.
1 with just a token
1 with no token
1 with a token and a querystring that contains the file type at the end. (this hack is how im getting around the problem right now but it is starting to have issues with the video provider, i shouldnt have to add this heck, just let me define the video file type in a prop to source={uri: «>token=1234», type: «m3u8»})

Понравилась статья? Поделить с друзьями:

Читайте также:

  • None local0 info bmminer null 0 invalid nonce hw error
  • Nonce error please reload перевод
  • Non unicode windows 10 как изменить
  • Non system disk press any key как исправить
  • Non system disk or disk error что это

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии