diff -ur mythtv/libs/libmythtv/mythplayer.cpp mythtv/libs/libmythtv/mythplayer.cpp
--- mythtv/libs/libmythtv/mythplayer.cpp
+++ mythtv/libs/libmythtv/mythplayer.cpp
@@ -620,6 +620,7 @@
                     .arg(videosync->getRefreshInterval())
                     .arg(ri));
                 videosync->setRefreshInterval(ri);
+                ApplyVideoPipelineFrameDelay(ri);
              }
         }
 
@@ -1786,6 +1787,25 @@
                                 refreshrate);
 }
 
+void MythPlayer::ApplyVideoPipelineFrameDelay(int refreshrate)
+{
+    // apply VideoSyncDelayFrames if applicable
+    double output_rate = 1000000.0 / refreshrate;
+    LOG(VB_PLAYBACK, LOG_INFO, LOC +
+        QString("Using output refresh rate of %1 for pipelined video audio synchronization")
+        .arg(output_rate));
+
+    tc_wrap_frameoffset[TC_AUDIO] = ((1000.0 / output_rate)
+                * gCoreContext->GetNumSetting("VideoSyncDelayFrames", 0));
+    LOG(VB_PLAYBACK, LOG_INFO, LOC +
+        QString("Calculated delay: %1ms")
+        .arg(tc_wrap_frameoffset[TC_AUDIO]));
+
+    this->AdjustAudioTimecodeOffset(
+                0, gCoreContext->GetNumSetting("AudioSyncOffset", 0)
+                + tc_wrap_frameoffset[TC_AUDIO]);
+}
+
 void MythPlayer::ResetAVSync(void)
 {
     avsync_avg = 0;
@@ -1837,6 +1857,8 @@
 
         SetFrameInterval(m_scan, 1.0 / (video_frame_rate * play_speed));
 
+        ApplyVideoPipelineFrameDelay(refreshrate);
+
         // try to get preferential scheduling, but ignore if we fail to.
         myth_nice(-19);
     }
diff -ur mythtv/libs/libmythtv/mythplayer.h mythtv/libs/libmythtv/mythplayer.h
--- mythtv/libs/libmythtv/mythplayer.h
+++ mythtv/libs/libmythtv/mythplayer.h
@@ -549,7 +549,7 @@
     // Time Code adjustment stuff
     int64_t AdjustAudioTimecodeOffset(int64_t v, int newsync = -9999);
     int64_t GetAudioTimecodeOffset(void) const
-        { return tc_wrap[TC_AUDIO]; }
+        { return tc_wrap[TC_AUDIO] - tc_wrap_frameoffset[TC_AUDIO]; }
 
     // Playback (output) zoom automation
     DetectLetterbox *detect_letter_box;
@@ -613,6 +613,7 @@
     void  WrapTimecode(int64_t &timecode, TCTypes tc_type);
     void  InitAVSync(void);
     virtual void AVSync(VideoFrame *buffer, bool limit_delay = false);
+    void ApplyVideoPipelineFrameDelay(int refreshrate);
     void  ResetAVSync(void);
     int64_t AVSyncGetAudiotime(void);
     void  SetFrameInterval(FrameScanType scan, double speed);
@@ -838,6 +839,7 @@
     int        prevtc;        ///< 32 bit timecode if last VideoFrame shown
     int        prevrp;        ///< repeat_pict of last frame
     int64_t    tc_wrap[TCTYPESMAX];
+    int64_t    tc_wrap_frameoffset[TCTYPESMAX];
     int64_t    tc_lastval[TCTYPESMAX];
     int64_t    savedAudioTimecodeOffset;
 
