Fix a few cases where ffmpeg produces no output (#3161)

* Treat no output from ffmpeg as an error condition
* Distinguish file vs. video duration, and use later where appropriate
* Check for empty file in generateFile

Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
alexandra-3
2022-11-21 16:21:27 +10:00
committed by GitHub
parent 045ba55def
commit abc9ec648a
6 changed files with 44 additions and 20 deletions

View File

@@ -19,15 +19,20 @@ type VideoFile struct {
AudioStream *FFProbeStream
VideoStream *FFProbeStream
Path string
Title string
Comment string
Container string
Duration float64
StartTime float64
Bitrate int64
Size int64
CreationTime time.Time
Path string
Title string
Comment string
Container string
// FileDuration is the declared (meta-data) duration of the *file*.
// In most cases (sprites, previews, etc.) we actually care about the duration of the video stream specifically,
// because those two can differ slightly (e.g. audio stream longer than the video stream, making the whole file
// longer).
FileDuration float64
VideoStreamDuration float64
StartTime float64
Bitrate int64
Size int64
CreationTime time.Time
VideoCodec string
VideoBitrate int64
@@ -127,7 +132,7 @@ func parse(filePath string, probeJSON *FFProbeJSON) (*VideoFile, error) {
result.Container = probeJSON.Format.FormatName
duration, _ := strconv.ParseFloat(probeJSON.Format.Duration, 64)
result.Duration = math.Round(duration*100) / 100
result.FileDuration = math.Round(duration*100) / 100
fileStat, err := os.Stat(filePath)
if err != nil {
statErr := fmt.Errorf("error statting file <%s>: %w", filePath, err)
@@ -178,6 +183,11 @@ func parse(filePath string, probeJSON *FFProbeJSON) (*VideoFile, error) {
result.Width = videoStream.Width
result.Height = videoStream.Height
}
result.VideoStreamDuration, err = strconv.ParseFloat(videoStream.Duration, 64)
if err != nil {
// Revert to the historical behaviour, which is still correct in the vast majority of cases.
result.VideoStreamDuration = result.FileDuration
}
}
return result, nil