diff a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioProcessor.mm b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioProcessor.mm
--- a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioProcessor.mm
+++ b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioProcessor.mm
@@ -277,6 +277,10 @@
         if (!context->audioSLU.get()->ProcessBufferLists(*bufferListInOut, numberFrames)) {
             NSLog(@"audioSLU ProcessBufferLists() failed");
             return;
         }
     }
+
+    if (context->audioSpectrum != nullptr) {
+        context->audioSpectrum.get()->SetFirstBufferDelivered(true);
+    }
 }
diff a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp
--- a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp
+++ b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.cpp
@@ -39,10 +39,11 @@
                                                mSampleRate(0),
                                                mChannels(0),
                                                mMaxFrames(0),
                                                mSamplesPerInterval(0),
                                                mRebuildCrunch(true),
+                                               mFirstBufferDelivered(false),
                                                mSpectrumElement(NULL),
                                                mSpectrum(NULL) {
     mMixBuffer.mNumberBuffers = 1;
     mMixBuffer.mBuffers[0].mData = NULL;
 
@@ -189,11 +190,12 @@
     mBands->UpdateBands(size, magnitudes, magnitudes);
 
     // Call our listener to dispatch the spectrum event
     if (mSpectrumCallbackProc) {
         double duration = (double) mSamplesPerInterval / (double) 44100;
-        mSpectrumCallbackProc(mSpectrumCallbackContext, duration);
+        double timestamp = mFirstBufferDelivered ? -1.0 : 0.0;
+        mSpectrumCallbackProc(mSpectrumCallbackContext, duration, timestamp);
     }
 
     unlockBands();
 }
 
@@ -212,10 +214,14 @@
 void AVFAudioSpectrumUnit::SetSpectrumCallbackProc(AVFSpectrumUnitCallbackProc proc, void *context) {
     mSpectrumCallbackProc = proc;
     mSpectrumCallbackContext = context;
 }
 
+void AVFAudioSpectrumUnit::SetFirstBufferDelivered(bool isFirstBufferDelivered) {
+    mFirstBufferDelivered = isFirstBufferDelivered;
+}
+
 static gboolean PostMessageCallback(GstElement * element, GstMessage * message) {
     if (message == NULL) {
         return FALSE;
     }
 
diff a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.h b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.h
--- a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.h
+++ b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFAudioSpectrumUnit.h
@@ -47,11 +47,12 @@
  *
  * callbackContext: user specified context pointer
  * timeStamp: the beginning time in seconds of the sample period (from beginning of stream)
  * duration: the length of time in seconds of the sample period
  */
-typedef void (*AVFSpectrumUnitCallbackProc)(void *callbackContext, double duration);
+typedef void (*AVFSpectrumUnitCallbackProc)(void *callbackContext, double duration,
+                                            double timestamp);
 
 class AVFAudioSpectrumUnit : public CAudioSpectrum {
 public:
     AVFAudioSpectrumUnit();
     virtual ~AVFAudioSpectrumUnit();
@@ -78,10 +79,11 @@
 
     void SetSampleRate(UInt32 rate);
     void SetChannels(UInt32 count);
     void SetMaxFrames(UInt32 maxFrames);
     void SetSpectrumCallbackProc(AVFSpectrumUnitCallbackProc proc, void *context);
+    void SetFirstBufferDelivered(bool isFirstBufferDelivered);
 
 private:
     AVFSpectrumUnitCallbackProc mSpectrumCallbackProc;
     void *mSpectrumCallbackContext;
     bool mEnabled;
@@ -100,10 +102,11 @@
     UInt32 mChannels;
     UInt32 mMaxFrames;
     UInt32 mSamplesPerInterval;
 
     bool mRebuildCrunch;
+    bool mFirstBufferDelivered;
 
     // GStreamer
     GstElement *mSpectrumElement;
     GstSpectrum *mSpectrum;
 
diff a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFMediaPlayer.mm b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFMediaPlayer.mm
--- a/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFMediaPlayer.mm
+++ b/modules/javafx.media/src/main/native/jfxmedia/platform/osx/avf/AVFMediaPlayer.mm
@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this
@@ -85,11 +85,11 @@
 #define TRACK_LOG(...) {}
 #endif
 
 @implementation AVFMediaPlayer
 
-static void SpectrumCallbackProc(void *context, double duration);
+static void SpectrumCallbackProc(void *context, double duration, double timestamp);
 
 static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink,
                                     const CVTimeStamp *inNow,
                                     const CVTimeStamp *inOutputTime,
                                     CVOptionFlags flagsIn,
@@ -649,23 +649,25 @@
         eventHandler->SendFrameSizeChangedEvent(previousWidth, previousHeight);
     }
     eventHandler->SendNewFrameEvent(frame);
 }
 
-- (void) sendSpectrumEventDuration:(double)duration {
+- (void) sendSpectrumEventDuration:(double)duration timestamp:(double)timestamp {
     if (eventHandler) {
-        double timestamp = self.currentTime;
+        if (timestamp < 0) {
+            timestamp = self.currentTime;
+        }
         eventHandler->SendAudioSpectrumEvent(timestamp, duration);
     }
 }
 
 @end
 
-static void SpectrumCallbackProc(void *context, double duration) {
+static void SpectrumCallbackProc(void *context, double duration, double timestamp) {
     if (context) {
         AVFMediaPlayer *player = (__bridge AVFMediaPlayer*)context;
-        [player sendSpectrumEventDuration:duration];
+        [player sendSpectrumEventDuration:duration timestamp:timestamp];
     }
 }
 
 static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext)
 {
