Index: libs/libmythtv/avformatdecoder.cpp
===================================================================
--- libs/libmythtv/avformatdecoder.cpp	(revision 16508)
+++ libs/libmythtv/avformatdecoder.cpp	(working copy)
@@ -1444,6 +1444,13 @@
     map<int,uint> lang_sub_cnt;
     map<int,uint> lang_aud_cnt;
 
+    if (ringBuffer->isDVD() &&
+        ringBuffer->DVD()->AudioStreamsChanged())
+    {
+        ringBuffer->DVD()->AudioStreamsChanged(false);
+        RemoveAudioStreams();
+    }
+
     for (uint i = 0; i < ic->nb_streams; i++)
     {
         AVCodecContext *enc = ic->streams[i]->codec;
@@ -3021,10 +3028,8 @@
                 if ((storedPackets.count() > 10 && !decodeStillFrame) ||
                     decodeStillFrame)
                 {
-                    RemoveAudioStreams();
                     storevideoframes = false;
                     dvdTitleChanged = false;
-                    ScanStreams(true);
                 }
                 else
                     storevideoframes = true;
@@ -4001,6 +4006,8 @@
         info = AudioInfo(codec_ctx->codec_id,
                          codec_ctx->sample_rate, codec_ctx->channels,
                          using_passthru && !disable_passthru);
+        if (ringBuffer->isDVD() && info.sample_rate == 0 && info.channels > 0)
+            info.sample_rate = 48000;
     }
 
     if (info == audioIn)
Index: libs/libmythtv/DVDRingBuffer.cpp
===================================================================
--- libs/libmythtv/DVDRingBuffer.cpp	(revision 16508)
+++ libs/libmythtv/DVDRingBuffer.cpp	(working copy)
@@ -34,7 +34,8 @@
       lastNav(NULL),    part(0),
       title(0),         titleParts(0),
       gotStop(false),
-      cellHasStillFrame(false), dvdWaiting(false),
+      cellHasStillFrame(false), audioStreamsChanged(false),
+      dvdWaiting(false),
       titleLength(0), hl_startx(0), hl_width(0),
       hl_starty(0), hl_height(0),
       menuBuflength(0),
@@ -446,6 +447,8 @@
                             break;
                     }
                 }
+                
+                audioStreamsChanged = true;
 
                 if (blockBuf != dvdBlockWriteBuf)
                 {
Index: libs/libmythtv/DVDRingBuffer.h
===================================================================
--- libs/libmythtv/DVDRingBuffer.h	(revision 16508)
+++ libs/libmythtv/DVDRingBuffer.h	(working copy)
@@ -41,11 +41,12 @@
     void GetPartAndTitle(int &_part, int &_title) const
         { _part  = part; _title = title; }
     uint GetTotalTimeOfTitle(void);
-    uint GetChapterLength(void) { return pgLength / 90000; }
+    uint GetChapterLength(void) const { return pgLength / 90000; }
     uint GetCellStart(void);
-    bool InStillFrame(void) { return cellHasStillFrame; }
-    bool IsWaiting(void) { return dvdWaiting; }
-    int  NumPartsInTitle(void) { return titleParts; }
+    bool InStillFrame(void) const { return cellHasStillFrame; }
+    bool AudioStreamsChanged(void) const { return audioStreamsChanged; }
+    bool IsWaiting(void) const { return dvdWaiting; }
+    int  NumPartsInTitle(void) const { return titleParts; }
     void GetMenuSPUPkt(uint8_t *buf, int len, int stream_id);
 
     AVSubtitleRect *GetMenuButton(void);
@@ -97,6 +98,7 @@
     int NumMenuButtons(void) const;
     void IgnoreStillOrWait(bool skip) { skipstillorwait = skip; }
     void InStillFrame(bool change) { cellHasStillFrame = change; }
+    void AudioStreamsChanged(bool change) { audioStreamsChanged = change; }
     uint GetCurrentTime(void) { return (currentTime / 90000); }
     uint TitleTimeLeft(void);
     void  SetTrack(uint type, int trackNo);
@@ -129,6 +131,7 @@
     bool           gotStop;
 
     bool           cellHasStillFrame;
+    bool           audioStreamsChanged;
     bool           dvdWaiting;
     long long      titleLength;
     MythTimer      stillFrameTimer;
Index: libs/libavformat/utils.c
===================================================================
--- libs/libavformat/utils.c	(revision 16508)
+++ libs/libavformat/utils.c	(working copy)
@@ -867,7 +867,7 @@
                 s->cur_pkt.pos = startpos;
 
             st = s->streams[s->cur_pkt.stream_index];
-            if(st->codec->debug & FF_DEBUG_PTS)
+            if(st && st->codec->debug & FF_DEBUG_PTS)
                 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n",
                     s->cur_pkt.stream_index,
                     s->cur_pkt.pts,
@@ -877,7 +877,7 @@
             s->cur_st = st;
             s->cur_ptr = s->cur_pkt.data;
             s->cur_len = s->cur_pkt.size;
-            if (st->need_parsing && !st->parser) {
+            if (st && st->need_parsing && !st->parser) {
                 st->parser = av_parser_init(st->codec->codec_id);
                 if (!st->parser) {
                     /* no parser available : just output the raw packets */
