Skip to content

Bug Report: Transcoding Fails Due to Non-Monotonic Timestamps #213

Open
@Tahmasebimh

Description

@Tahmasebimh

When transcoding a specific video, I encounter the following issue:

java.lang.IllegalStateException: Timestamps must be monotonically increasing: 17229000, 17229000
at com.otaliastudios.transcoder.internal.Timer$SegmentInterpolator.interpolate(Timer.kt:103)
at com.otaliastudios.transcoder.internal.codec.DecoderTimer.advance(DecoderTimer.kt:31)
at com.otaliastudios.transcoder.internal.pipeline.PipelineItem.handle(Pipeline.kt:37)
at com.otaliastudios.transcoder.internal.pipeline.Pipeline.execute(Pipeline.kt:84)
at com.otaliastudios.transcoder.internal.Segment.advance(Segment.kt:17)
at com.otaliastudios.transcoder.internal.transcode.DefaultTranscodeEngine.transcode(DefaultTranscodeEngine.kt:115)
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:264)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
This happens when trying to transcode a specific video file.

Steps to Reproduce
Use the following transcoding setup:

val transcoder = Transcoder.into(outputFile.path)
    .addDataSource(dataSource)
    .setVideoTrackStrategy(videoStrategy)
    .setAudioTrackStrategy(audioStrategy)
    .setTimeInterpolator(MonotonicTimeInterpolator())
    .setListener(object : TranscoderListener {
        override fun onTranscodeProgress(progress: Double) {
            Log.i(TAG, "Transcode Progress: ${progress * 100}%")
        }

        override fun onTranscodeCompleted(successCode: Int) {
            Log.i(TAG, "Transcoding Completed")
        }

        override fun onTranscodeFailed(exception: Throwable) {
            Log.e(TAG, "Transcoding Failed: ${exception.message}")
        }
    })
    .transcode()

Using a custom MonotonicTimeInterpolator to enforce increasing timestamps:

class MonotonicTimeInterpolator : TimeInterpolator {
private val last = mutableTrackMapOf(Long.MIN_VALUE, Long.MIN_VALUE)

override fun interpolate(type: TrackType, time: Long): Long {
    return interpolate(last[type], time).also { last[type] = it }
}

private fun interpolate(prev: Long, next: Long): Long {
    if (prev == Long.MIN_VALUE) return next
    return next.coerceAtLeast(prev + 1)
}

}
This prevents the non-monotonic timestamp issue, but then:

The transcoding stalls at the end.
If I set audio to pass-through:

val audioStrategy = TrackStrategy { _, _ -> TrackStatus.PASS_THROUGH }
the video transcodes without sound.

Could you provide guidance on how to handle this properly?

It happen for some videos and other transcoded without problem

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions