Use padding segment for audio since it give better results

This commit is contained in:
Zoe Roux 2024-02-24 16:04:22 +00:00
parent 1c71258984
commit de3013eebf

View File

@ -138,14 +138,20 @@ func (ts *Stream) run(start int32) error {
// Having an extra segment allows us to cut precisely the segments we want with the // Having an extra segment allows us to cut precisely the segments we want with the
// -f segment that does cut the begining and the end at the keyframe like asked // -f segment that does cut the begining and the end at the keyframe like asked
start_ref := float64(0) start_ref := float64(0)
start_segment := start
if start != 0 { if start != 0 {
if ts.handle.getFlags()&AudioF != 0 {
// when segmenting audio, we need -ss to have the context before the start time
// without it, the cut loses a bit of audio (audio gap of ~100ms)
start_segment = start - 1
}
// the param for the -ss takes the keyframe before the specificed time // the param for the -ss takes the keyframe before the specificed time
// (if the specified time is a keyframe, it either takes that keyframe or the one before) // (if the specified time is a keyframe, it either takes that keyframe or the one before)
// to prevent this weird behavior, we specify a bit after the keyframe that interest us // to prevent this weird behavior, we specify a bit after the keyframe that interest us
if start+1 == int32(len(ts.file.Keyframes)) { if start_segment+1 == int32(len(ts.file.Keyframes)) {
start_ref = (ts.file.Keyframes[start] + float64(ts.file.Info.Duration)) / 2 start_ref = (ts.file.Keyframes[start_segment] + float64(ts.file.Info.Duration)) / 2
} else { } else {
start_ref = (ts.file.Keyframes[start] + ts.file.Keyframes[start+1]) / 2 start_ref = (ts.file.Keyframes[start_segment] + ts.file.Keyframes[start_segment+1]) / 2
} }
} }
end_padding := int32(1) end_padding := int32(1)
@ -192,7 +198,7 @@ func (ts *Stream) run(start int32) error {
// it seems that the -to is confused when -ss seek before the given time (because it searches for a keyframe) // it seems that the -to is confused when -ss seek before the given time (because it searches for a keyframe)
// add back the time that would be lost otherwise // add back the time that would be lost otherwise
// this only appens when -to is before -i but having -to after -i gave a bug (not sure, don't remember) // this only appens when -to is before -i but having -to after -i gave a bug (not sure, don't remember)
end_ref += start_ref - ts.file.Keyframes[start] end_ref += start_ref - ts.file.Keyframes[start_segment]
args = append(args, args = append(args,
"-to", fmt.Sprintf("%.6f", end_ref), "-to", fmt.Sprintf("%.6f", end_ref),
) )
@ -221,7 +227,7 @@ func (ts *Stream) run(start int32) error {
// segment_times want durations, not timestamps so we must substract the -ss param // segment_times want durations, not timestamps so we must substract the -ss param
// since we give a greater value to -ss to prevent wrong seeks but -segment_times // since we give a greater value to -ss to prevent wrong seeks but -segment_times
// needs precise segments, we use the keyframe we want to seek to as a reference. // needs precise segments, we use the keyframe we want to seek to as a reference.
return seg - ts.file.Keyframes[start] return seg - ts.file.Keyframes[start_segment]
})), })),
"-segment_list_type", "flat", "-segment_list_type", "flat",
"-segment_list", "pipe:1", "-segment_list", "pipe:1",