setdar is irrelevant for this problem. To fix audio-video drift and cut artifacts, you must reset presentation timestamps with setpts and resample audio streams to ensure continuous timing across the joined segments.
Understanding Timestamp Discontinuities
When you cut a video into segments, each segment starts its internal clock at zero or retains the original start time relative to the source file. FFmpeg's concat filter expects streams that are already synchronized in time. If Segment A ends at timestamp 10 seconds and Segment B starts at timestamp 0, the resulting output will have a gap or overlap, causing visible stuttering or audio desynchronization.
The core issue is that the decoder reads frames based on their Presentation Time Stamp (PTS). If these stamps are not normalized across segments, the player cannot render them smoothly. This is distinct from frame extraction issues discussed in Extracting Frames from a Video using FFmpeg, where individual frame integrity is the focus, whereas here we deal with stream continuity.
Resetting Video Timestamps
To resolve video sync issues, you need to force FFmpeg to recalculate the PTS for every frame in each segment. This ensures that the first frame of the second segment immediately follows the last frame of the first segment without any time gaps.
- Identify the video stream: Use
-map 0:v:0to select the primary video track from your input files. - Apply the setpts filter: Insert
setpts=PTS-STARTPTSinto your filter chain. This subtracts the starting timestamp of each segment from all subsequent timestamps, effectively resetting the timeline to start at zero for each piece.
This step is crucial because it creates a clean slate for the concatenation process. Without this normalization, the concat demuxer or filter may struggle to align frames correctly, leading to the glitches described in the original query.
Synchronizing Audio Streams
Video synchronization is only half the battle; audio often drifts due to different sample rates or buffer handling. Even if video timestamps are fixed, audio packets might arrive at irregular intervals if they were encoded with variable bitrates or different container formats.
You should use the aresample filter to standardize the audio timing. By specifying aresample=async=1, FFmpeg inserts silence or drops samples to compensate for minor timing differences between the video and audio streams. This prevents the "lip-sync" error where dialogue appears slightly before or after the speaker's mouth moves.
For more robust synchronization, consider combining aresample with asetpts=PTS-STARTPTS for the audio stream as well. This mirrors the video processing and ensures both media types share a unified temporal reference point before concatenation.
Handling Frame Rate Mismatches
If your source videos have different frame rates (e.g., one is 30fps and another is 60fps), simple concatenation can cause playback speed variations or stuttering. The player attempts to display frames at the rate of the first segment, then abruptly switches expectations when encountering the second segment.
To mitigate this, convert all inputs to a common frame rate before concatenating. Use the fps filter with a specific rate, such as fps=30. While this may involve dropping or duplicating frames, it provides a consistent playback rhythm. This approach is similar to techniques used when dealing with Error Concatenating Two Parts of Different Speeds with FFmpeg, where uniformity is key to stable output.
Ensure that the fps filter is applied after setpts but before the final concat operation. This sequence guarantees that the temporal structure is linear and the frame density is uniform across the entire merged file.
Complete Command Structure
Combining these solutions results in a robust command line. Below is an example structure that addresses both video and audio synchronization for two input files.
ffmpeg -i input1.mp4 -i input2.mp4 \
-filter_complex "[0:v]setpts=PTS-STARTPTS[v0]; [0:a]aresample=async=1[a0]; [1:v]setpts=PTS-STARTPTS[v1]; [1:a]aresample=async=1[a1]; [v0][a0][v1][a1]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
In this command, each video stream gets its timestamps reset, and each audio stream is adjusted for async alignment. The concat filter then joins them seamlessly. Note that we explicitly map the outputs to avoid including unused streams.
For users working with Python scripts, remember that the logic remains identical regardless of the interface. As detailed in Unable to Concatenate Videos using FFmpeg Python, the underlying ffmpeg process requires the same filters to achieve sync stability. Always verify the output by checking the duration and playing the result in a media player like VLC, which offers built-in diagnostics for timestamp anomalies.
Frequently Asked Questions
Why does my video still skip even after using setpts?
If skipping persists, the issue likely lies in the audio stream or frame rate mismatch rather than video timestamps. Ensure you have also applied aresample=async=1 to the audio tracks. Additionally, check if your source files have varying frame rates and apply a uniform fps filter to all inputs before concatenation.
Can I use concat demuxer instead of the filter?
The concat demuxer is faster but requires all input files to be identical in codec, resolution, and frame rate. It does not perform automatic timestamp correction. For disparate clips, the filter-based approach with setpts is necessary to handle the temporal reordering that the demuxer cannot manage.
What causes audio drift during long concatenations?
Audio drift typically occurs when the audio sample rate differs from the video frame rate or when buffers are not flushed correctly between segments. Using aresample=async=1 helps correct minor drifts, but for large discrepancies, resampling all audio to a standard rate like 48kHz before concatenation is recommended.
Does SAR affect video sync issues?
No, Spatial Aspect Ratio (SAR) has no impact on temporal synchronization. Changing SAR with setdar or setsar only alters the pixel shape and display dimensions. Sync issues are purely related to PTS, DTS, and frame timing, which are handled by setpts and audio filters.
How do I debug timestamp errors in FFmpeg?
Enable verbose logging with -v trace to see detailed packet information. Look for warnings about non-monotonic timestamps or duplicate packets. You can also use ffprobe to inspect the PTS values of individual segments before merging them to identify where the discontinuity originates.