Transcoder icon indicating copy to clipboard operation
Transcoder copied to clipboard

writeSampleData returned an error

Open DamonChen117 opened this issue 4 years ago • 7 comments

Version:0.10.3 Android 10

Exception:

2021-04-08 14:15:55.205 23911-25813/com.xxx E/MPEG4Writer: do not support out of order frames (timestamp: 3045687 < last: 3045801 for Audio track
2021-04-08 14:15:55.205 23911-25813/com.xxx E/MPEG4Writer: 0 frames to dump timeStamps in Audio track 
....
2021-04-08 11:58:41.753 30151-31283/com.xxx E/MediaAdapter: pushBuffer called before start
2021-04-08 11:58:41.755 30151-31283/com.xxx E/TranscodeEngine: Unexpected error while transcoding.
    java.lang.IllegalStateException: writeSampleData returned an error
        at android.media.MediaMuxer.nativeWriteSampleData(Native Method)
        at android.media.MediaMuxer.writeSampleData(MediaMuxer.java:711)
        at com.otaliastudios.transcoder.sink.DefaultDataSink.writeTrack(DefaultDataSink.java:163)
        at com.otaliastudios.transcoder.internal.utils.EosIgnoringDataSink.writeTrack(eos.kt:25)
        at com.otaliastudios.transcoder.internal.data.Writer.step(Writer.kt:50)
        at com.otaliastudios.transcoder.internal.pipeline.Pipeline.executeStep(Pipeline.kt:51)
        at com.otaliastudios.transcoder.internal.pipeline.Pipeline.execute(Pipeline.kt:28)
        at com.otaliastudios.transcoder.internal.Segment.advance(Segment.kt:18)
        at com.otaliastudios.transcoder.internal.transcode.DefaultTranscodeEngine.transcode(DefaultTranscodeEngine.kt:114)
        at com.otaliastudios.transcoder.internal.transcode.TranscodeEngine$Companion.transcode(TranscodeEngine.kt:48)
        at com.otaliastudios.transcoder.internal.transcode.TranscodeEngine.transcode(Unknown Source:2)
        at com.otaliastudios.transcoder.Transcoder$1.call(Transcoder.java:102)
        at com.otaliastudios.transcoder.Transcoder$1.call(Transcoder.java:99)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        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)

the datasources are ClipDataSource, FilePathDataSource, ClipDataSource, FilePathDataSource...

DamonChen117 avatar Apr 08 '21 04:04 DamonChen117

Tried with below work around, the audios can be joined successfully.

var presentationTimeUs = 0L

...
private class EosIgnoringDataSink{

    override fun writeTrack(type: TrackType, byteBuffer: ByteBuffer, bufferInfo: MediaCodec.BufferInfo) {
        if (bufferInfo.presentationTimeUs < presentationTimeUs){
            return
        }
        presentationTimeUs = bufferInfo.presentationTimeUs

        ...
}

Edit: if put the global presentationTimeUs in EosIgnoringDataSink, the error still occurs. So the timestamps error happens between datasinks.

DamonChen117 avatar Apr 08 '21 11:04 DamonChen117

Can you attach the files here so that I can reproduce the issue myself? I want to understand why the timestamps are not correct in the first place.

natario1 avatar Apr 08 '21 11:04 natario1

I uploaded the audio files to https://github.com/DamonChen117/ebAndroid/blob/master/audios.zip

the datasources are:

ClipDataSource(main.mp3), FilePathDataSource(0.amr),

ClipDataSource(main.mp3), FilePathDataSource(1.amr),

ClipDataSource(main.mp3), FilePathDataSource(2.amr), ....

DamonChen117 avatar Apr 08 '21 11:04 DamonChen117

Do you create a new ClipDataSource(main.mp3) every time or do you use new one?

addDataSource(ClipDataSource(FilePathDataSource("main.mp3")))
addDataSource(ClipDataSource(FilePathDataSource("main.mp3")))
addDataSource(ClipDataSource(FilePathDataSource("main.mp3")))

This below is an error:

val source = ClipDataSource(FilePathDataSource("main.mp3"))
addDataSource(source)
addDataSource(source)
addDataSource(source)

Also this would be an error:

val source = FilePathDataSource("main.mp3")
addDataSource(ClipDataSource(source))
addDataSource(ClipDataSource(source))
addDataSource(ClipDataSource(source))

natario1 avatar Apr 08 '21 16:04 natario1

I create new datasource each time:

for (...) {
            ...
                    val source = ClipDataSource(FilePathDataSource(mainAudioFile.path), endTime, start)
                    builder.addDataSource(TrackType.AUDIO, source)
             ...

                val source = FilePathDataSource(url.getPath())
                builder.addDataSource(TrackType.AUDIO, source)
            ...
            
        }

DamonChen117 avatar Apr 09 '21 00:04 DamonChen117

I was not able to reproduce this. Can you take a look here? https://github.com/natario1/Transcoder/blob/fix_137/lib/src/androidTest/java/com/otaliastudios/transcoder/integration/IssuesTests.kt

You can run the test and see what happens. It's in the fix_137 branch. Maybe the clip position matters.

natario1 avatar Apr 15 '21 15:04 natario1

Hi, I was not able to run test case. The run test menu not show up.

But my clip time is like: addDataSource(ClipDataSource(input("main.mp3"), 0L, 1000_000L)) addDataSource(input("0.amr")) addDataSource(ClipDataSource(input("main.mp3"), 2000_000L, 3000_000L)) addDataSource(input("1.amr")) addDataSource(ClipDataSource(input("main.mp3"), 4000_000L, 5000_000L)) addDataSource(input("2.amr")) addDataSource(ClipDataSource(input("main.mp3"), 6000_000L, 7000_000L)) addDataSource(input("3.amr")) addDataSource(ClipDataSource(input("main.mp3"), 8000_000L, 9000_000L)) addDataSource(input("4.amr")) addDataSource(ClipDataSource(input("main.mp3"), 10000_000L, 11000_000L)) addDataSource(input("5.amr")) addDataSource(ClipDataSource(input("main.mp3"), 12000_000L, 13000_000L)) addDataSource(input("6.amr")) addDataSource(ClipDataSource(input("main.mp3"), 14000_000L, 15000_000L)) addDataSource(input("7.amr")) addDataSource(ClipDataSource(input("main.mp3"), 16000_000L, 17000_000L)) addDataSource(input("8.amr"))

DamonChen117 avatar Apr 27 '21 12:04 DamonChen117