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

Invalid Nal Length Error In Playing Encrypted video online #11229

Open MohsenNaderzadeh opened 1 year ago

MohsenNaderzadeh commented 1 year ago

Hi, I have an encrypted video stored on the server which I want to play in Exoplayer. I am using this repo custom datasource for playing encrypted video offline. For online playback, I added some code from Exoplayer DefaultHttpDataSource to implement the setupInputStream function from the server instead of the local file. The video plays but when I change the seekbar position after a few moments, I get an Invalid Nal Length Error and OnPlayerError is called. My Encryption Alghoritm is AES/CTR/NOPadding

tianyif commented 1 year ago

Hi @MohsenNaderzadeh,

Did you try to reproduce the issue with the demo app? If the problem happens on the demo app, could you please provide us the media so that we can investigate on our end?

Thanks!

droplet-js commented 1 year ago

i have same issue

def exoplayer_version = "2.18.7"
implementation "com.google.android.exoplayer:exoplayer-core:${exoplayer_version}"
implementation "com.google.android.exoplayer:exoplayer-hls:${exoplayer_version}"
implementation "com.google.android.exoplayer:exoplayer-dash:${exoplayer_version}"
implementation "com.google.android.exoplayer:exoplayer-smoothstreaming:${exoplayer_version}"
E/ExoPlayerImplInternal( 4684): Playback error
E/ExoPlayerImplInternal( 4684):   com.google.android.exoplayer2.ExoPlaybackException: Source error
E/ExoPlayerImplInternal( 4684):       at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:644)
E/ExoPlayerImplInternal( 4684):       at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:614)
E/ExoPlayerImplInternal( 4684):       at android.os.Handler.dispatchMessage(Handler.java:106)
E/ExoPlayerImplInternal( 4684):       at android.os.Looper.loop(Looper.java:219)
E/ExoPlayerImplInternal( 4684):       at android.os.HandlerThread.run(HandlerThread.java:67)
E/ExoPlayerImplInternal( 4684):   Caused by: com.google.android.exoplayer2.ParserException: Invalid NAL length
E/ExoPlayerImplInternal( 4684):       at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.readSample(Mp4Extractor.java:641)
E/ExoPlayerImplInternal( 4684):       at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.read(Mp4Extractor.java:259)
E/ExoPlayerImplInternal( 4684):       at com.google.android.exoplayer2.source.BundledExtractorsAdapter.read(BundledExtractorsAdapter.java:127)
E/ExoPlayerImplInternal( 4684):       at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1039)
E/ExoPlayerImplInternal( 4684):       at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:412)
E/ExoPlayerImplInternal( 4684):       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/ExoPlayerImplInternal( 4684):       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/ExoPlayerImplInternal( 4684):       at java.lang.Thread.run(Thread.java:929)
MohsenNaderzadeh commented 1 year ago

Hi @tianyif, My video is encrypted with the encryption algorithm as I said, Can I play it with the demo app? Is it possible?

icbaker commented 1 year ago

If you've written a custom DataSource I recommend testing it with a subclass of DataSourceContractTest to check you implemented the interface correctly and fully. More info here: https://medium.com/google-exoplayer/standardising-datasource-implementations-through-testing-b7a8ab04f8d1

From the description (seeking breaks things) it sounds like possibly your implementation doesn't handle being closed and re-opened? Bit of a guess.

MohsenNaderzadeh commented 1 year ago

Hi @icbaker, I added DefaultHttpDataSourceContractTest as a test subclass of DataSourceContractTest. As a part of the test, I passed Exoplayer's own DefaultHttpDataSource as an implementation of the createDataSource function. All of the tests passed except for two that are related to Mockito and unit testing. I am currently unable to resolve these errors and run the test class successfully. Once I have resolved these issues and successfully run the test class, I will proceed to test my own custom data source. Please keep my issue open until I have resolved the errors and run the test class successfully.

icbaker commented 1 year ago

Not sure if you've already seen it, but you might want to take a look at our DefaultHttpDataSourceContractTest and the HttpDataSourceTestEnv it uses to set up serving test data at various URLs using Square's MockWebServer.

ladeng commented 3 weeks ago

I hava same issue i use Encrypt with “AES/CBC/PKCS5Padding”

I am playing a local encrypted video. after setting the video resource, sliding the progress bar to set the playback progress(player.seekTo ) will cause an exception: CCodecBuffers: [c2.android.aac.decoder#819:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 0 CCodecBuffers: [c2.android.aac.decoder#819:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 1 CCodecBuffers: [c2.android.aac.decoder#819:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 2 CCodecBuffers: [c2.android.aac.decoder#819:1D-Output.Impl[N]] Client returned a buffer it does not own according to our record: 3 ExoPlayerImplInternal: Playback error com.google.android.exoplayer2.ExoPlaybackException: Source error at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:684) at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:654) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:219) at android.os.HandlerThread.run(HandlerThread.java:67) Caused by: com.google.android.exoplayer2.ParserException: Invalid NAL length{contentIsMalformed=true, dataType=1} at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.readSample(Mp4Extractor.java:654) at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.read(Mp4Extractor.java:266) at com.google.android.exoplayer2.source.BundledExtractorsAdapter.read(BundledExtractorsAdapter.java:133) at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1047) at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:420) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:929)

when the encrypted video is played to the last frame, the output error: BufferPoolAccessor: bufferpool2 0x79ba9f0a20 : 6(49152 size) total buffers - 5(40960 size) used buffers - 1/7 (recycle/alloc) - 10/619 (fetch/transfer) ExoPlayerImplInternal: Playback error com.google.android.exoplayer2.ExoPlaybackException: Source error at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:684) at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:660) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:219) at android.os.HandlerThread.run(HandlerThread.java:67) Caused by: java.io.EOFException at com.google.android.exoplayer2.source.SampleDataQueue.sampleData(SampleDataQueue.java:194) at com.google.android.exoplayer2.source.SampleQueue.sampleData(SampleQueue.java:598) at com.google.android.exoplayer2.extractor.TrackOutput.sampleData(TrackOutput.java:165) at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.readSample(Mp4Extractor.java:684) at com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.read(Mp4Extractor.java:266) at com.google.android.exoplayer2.source.BundledExtractorsAdapter.read(BundledExtractorsAdapter.java:133) at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1047) at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:420) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:929)

but after the video is decrypted and output as an mp4 file, it is normal to play it again, so my encrypted video file seems to be fine? after several days of trying, I have not found a solution yet. please help me!