writeSampleData returned an error
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...
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.
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.
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), ....
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))
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)
...
}
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.
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"))