google / ExoPlayer

This project is deprecated and stale. The latest ExoPlayer code is available in https://github.com/androidx/media
https://developer.android.com/media/media3/exoplayer
Apache License 2.0
21.7k stars 6.02k forks source link

how to check those mp4 file valid for exoplayer #2906

Closed Livekus closed 7 years ago

Livekus commented 7 years ago

Before filing an issue:

I run with video is local file ( not streamimng)

    ` Handler handler = new Handler() ;
  DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
    TrackSelector trackSelector = new DefaultTrackSelector( videoTrackSelectionFactory);`

 player = ExoPlayerFactory.newSimpleInstance(mContext, trackSelector,new DefaultLoadControl());

   viewVideo.setUseController(false);

    viewVideo.setUseArtwork(true);

    viewVideo.requestFocus();

    viewVideo.setPlayer(player);

   MediaSource videoSource;

    LoopingMediaSource loopingMediaSource;

    MediaSource concatenatedSource = null;
    ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mContext,
    Util.getUserAgent(mContext, mContext.getPackageName()), bandwidthMeter);

    Uri uri = Uri.parse(eachSource);
            videoSource = new ExtractorMediaSource(uri,
                        dataSourceFactory, extractorsFactory, handler, null);
    loopingMediaSource
                = new LoopingMediaSource(videoSource);
        player.prepare(loopingMediaSource);
        player.setPlayWhenReady(true);
       `

by this code above , i can play some mp4 file but some file is not playable , i have no idea for check what is different between those mp4 file , i use mediainfo program on ubantu for inspection ,but no luck ,please tell me how to check those mp4 file compatible with exoplayer

When reporting a bug:

06-05 16:17:30.219 23224-30951/com.apptividia.digitalsignage D/mali_winsys: EGLint new_window_surface(egl_winsys_display, void, EGLSurface, EGLConfig, egl_winsys_surface*, egl_color_buffer_format, EGLBoolean) returns 0x3000, [1920x1080]-format:1 06-05 16:17:33.239 23224-31030/com.apptividia.digitalsignage E/ExoPlayerImplInternal: Source error. java.io.EOFException at com.google.android.exoplayer2.extractor.DefaultExtractorInput.readFromDataSource(DefaultExtractorInput.java:262) at com.google.android.exoplayer2.extractor.DefaultExtractorInput.readFully(DefaultExtractorInput.java:70) at com.google.android.exoplayer2.extractor.DefaultExtractorInput.readFully(DefaultExtractorInput.java:79) at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.readAtomPayload(Mp4Extractor.java:252) at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.read(Mp4Extractor.java:147) at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:643) at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:295) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:762) 06-05 16:17:33.247 23224-23224/com.apptividia.digitalsignage W/System.err: com.google.android.exoplayer2.ExoPlaybackException 06-05 16:17:33.247 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:345) 06-05 16:17:33.247 23224-23224/com.apptividia.digitalsignage W/System.err: at android.os.Handler.dispatchMessage(Handler.java:98) 06-05 16:17:33.247 23224-23224/com.apptividia.digitalsignage W/System.err: at android.os.Looper.loop(Looper.java:154) 06-05 16:17:33.247 23224-30626/com.apptividia.digitalsignage I/System.out: (HTTPLog)-Static: isSBSettingEnabled false 06-05 16:17:33.248 23224-23224/com.apptividia.digitalsignage W/System.err: at android.os.HandlerThread.run(HandlerThread.java:61) 06-05 16:17:33.248 23224-30626/com.apptividia.digitalsignage I/System.out: (HTTPLog)-Static: isSBSettingEnabled false 06-05 16:17:33.249 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40) 06-05 16:17:33.249 23224-23224/com.apptividia.digitalsignage W/System.err: Caused by: java.io.EOFException 06-05 16:17:33.250 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.extractor.DefaultExtractorInput.readFromDataSource(DefaultExtractorInput.java:262) 06-05 16:17:33.250 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.extractor.DefaultExtractorInput.readFully(DefaultExtractorInput.java:70) 06-05 16:17:33.250 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.extractor.DefaultExtractorInput.readFully(DefaultExtractorInput.java:79) 06-05 16:17:33.251 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.readAtomPayload(Mp4Extractor.java:252) 06-05 16:17:33.251 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.read(Mp4Extractor.java:147) 06-05 16:17:33.251 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:643) 06-05 16:17:33.251 23224-23224/com.apptividia.digitalsignage W/System.err: at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:295) 06-05 16:17:33.251 23224-23224/com.apptividia.digitalsignage W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 06-05 16:17:33.251 23224-23224/com.apptividia.digitalsignage W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 06-05 16:17:33.251 23224-23224/com.apptividia.digitalsignage W/System.err: at java.lang.Thread.run(Thread.java:762)

Link to test content

1080p video is playable

playablevideo1 playablevideo2

1080p video is not playable

errorvideo1 errorvideo2

Version of ExoPlayer being used

exoplayer 2.3.1

Device(s) and version(s)

android 7 sumsung galazy s7

ojw28 commented 7 years ago

The original cause of failure (clipped off the top of what you've provided), is:

EventLogger: com.google.android.exoplayer2.ParserException: The edited sample sequence does not contain a sync sample.
EventLogger:    at com.google.android.exoplayer2.extractor.mp4.AtomParsers.parseStbl(AtomParsers.java:398)
EventLogger:    at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.processMoovAtom(Mp4Extractor.java:343)

It appears the problematic media has a strange edit list, that's discarding the first 4 video frames for no apparent reason. The first frame is the only key-frame, so after applying the edit list we end up with no key-frames from which to start playback.

Playing this type of media correctly is tracked by https://github.com/google/ExoPlayer/issues/1659, although there doesn't seem to be a valid reason for the edit list to exist in the piece of media. If you have control over the media itself then you should just fix it to not include an edit list.

Livekus commented 7 years ago

Ok ,Could you please give me some information about edit list ?,( i have no idea what edit list do in mp4 file ) , before i exclude edit list form mp4 file.

ojw28 commented 7 years ago

Advising on correct media preparation is outside the scope of this issue tracker, sorry. I'd suggest asking on StackOverflow or similar.