deepmedia / Transcoder

🎞 Hardware-accelerated video transcoding using Android MediaCodec APIs. Supports cropping, concatenation, clipping, audio processing, video speed and much more.
https://opensource.deepmedia.io/transcoder
Apache License 2.0
783 stars 166 forks source link

Audio/Video out of sync #78

Open buntupana opened 4 years ago

buntupana commented 4 years ago

using version: 0.9.0

I'm concatenating several videos and as a result I'm getting a video with a big sync delay with audio. Videos are taken from camera using CameraView library. I'm aware that a video recorded by phone camera usually has audio/video different lengths and that that is provoking the problem..but shouldn't be the transcoder taking care of it.

cbernier commented 4 years ago

How many are you concatenating?

How long is the delay, ms or seconds?

If the length of the audio track of the videos doesn't match exactly the length of the video track then this will happen.

buntupana commented 4 years ago

I'm concatenating around 10 videos.

The delay reach almost a second.

Yhea, that's exactly what's happening. Recording videos from phone camera can give a different video/audio length file and it would be really nice to have some option for the transcoder to take care of this problem since could be a common use of appending videos from phone camera.

cbernier commented 4 years ago

You can maybe work around it by trimming your audio data source to match the video counter part:

                var videoDataSource:DataSource = UriDataSource(context, videoUri);
                var audioDataSource:DataSource = UriDataSource(context, audioUri);
                if (videoDataSource.durationUs > audioDataSource.durationUs) {
                    videoDataSource = TrimDataSource(videoDataSource, 0, videoDataSource.durationUs - audioDataSource.durationUs)
                } else if (videoDataSource.durationUs < audioDataSource.durationUs) {
                    audioDataSource = TrimDataSource(videoDataSource, 0, audioDataSource.durationUs - videoDataSource.durationUs)
                }
                builder.addDataSource(TrackType.AUDIO, audioDataSource)
                builder.addDataSource(TrackType.VIDEO, videoDataSource)

(I didn't test this code)

buntupana commented 4 years ago

@cbernier2 in this case I will have to split the video and audio in two different files before apply this code. I think appending videos should somehow apply a fix to avoid out of sync problem automatically since it's a common practice.

cbernier commented 4 years ago

@buntupana You don't have to split the video and audio, use the same file and by specifying TrackType.AUDIO, the transcoder will know to apply the Trim to only the audio.

gaborSomogyvari commented 3 years ago
  var videoDataSource:DataSource = UriDataSource(context, videoUri);         <-same uri for both
  var audioDataSource:DataSource = UriDataSource(context, audioUri);        <-same uri for both
  if (videoDataSource.durationUs > audioDataSource.durationUs) {               <-same lenght

@cbernier2 Hi, If I have one .mp4 file, putting it into a videoDataSource and audioDataSource will produce the SAME .durationUs results, since we created the video and audio datasource from the same file. We cannot compare them, as they are the same.

I have the exact same problem as @buntupana, as my audio gets out of sync more and more, the more files I append @buntupana, have you found any solution?

buntupana commented 3 years ago

@gaborSomogyvari finally I decided to switch to a ffmpeg library

natario1 commented 2 months ago

(Pasted to all my answers today: it's been a long time since my last issues review. I am sorry about the delay and I know you likely have moved on by now. Still, I'm going to answer where I can)

Sorry to hear about this issue. Can anyone provide two files that, if concatenated, create the out-of-sync problem?