Index: /trunk/src/VBox/Main/src-client/DrvAudioVideoRec.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/DrvAudioVideoRec.cpp	(revision 65280)
+++ /trunk/src/VBox/Main/src-client/DrvAudioVideoRec.cpp	(revision 65281)
@@ -235,5 +235,5 @@
                                           WebMWriter::AudioCodec_Opus, WebMWriter::VideoCodec_None);
                 if (RT_SUCCESS(rc))
-                    rc = pThis->pEBML->AddAudioTrack(44100.0, 44100, 2, 16);
+                    rc = pThis->pEBML->AddAudioTrack(44100, 2, 16);
                 break;
             }
Index: /trunk/src/VBox/Main/src-client/EbmlIDs.h
===================================================================
--- /trunk/src/VBox/Main/src-client/EbmlIDs.h	(revision 65280)
+++ /trunk/src/VBox/Main/src-client/EbmlIDs.h	(revision 65281)
@@ -134,4 +134,6 @@
 //  TrackTranslateCodec = 0x66BF,
 //  TrackTranslateTrackID = 0x66A5,
+    CodecDelay = 0x56AA,
+    SeekPreRoll = 0x56BB,
     //video
     Video = 0xE0,
Index: /trunk/src/VBox/Main/src-client/EbmlWriter.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/EbmlWriter.cpp	(revision 65280)
+++ /trunk/src/VBox/Main/src-client/EbmlWriter.cpp	(revision 65281)
@@ -1,5 +1,5 @@
 /* $Id$ */
 /** @file
- * EbmlWriter.cpp - EBML writer + WebM container
+ * EbmlWriter.cpp - EBML writer + WebM container handling.
  */
 
@@ -316,10 +316,20 @@
     struct OpusPrivData
     {
+        OpusPrivData(uint32_t a_u32SampleRate, uint8_t a_u8Channels)
+            : u8Channels(a_u8Channels)
+            , u32SampleRate(a_u32SampleRate) { }
+
+        /** "OpusHead". */
         uint8_t  au8Head[8]      = { 0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64 };
+        /** Must set to 1. */
         uint8_t  u8Version       = 1;
-        uint8_t  c8Channels      = 0;
+        uint8_t  u8Channels      = 0;
         uint16_t u16PreSkip      = 0;
+        /** Sample rate *before* encoding to Opus.
+         *  Note: This rate has nothing to do with the playback rate later! */
         uint32_t u32SampleRate   = 0;
         uint16_t u16Gain         = 0;
+        /** Must stay 0 -- otherwise a mapping table must be appended
+         *  right after this header. */
         uint8_t  u8MappingFamily = 0;
     };
@@ -385,5 +395,5 @@
         , m_offSegClusterStart(0) {}
 
-    int AddAudioTrack(float fSamplingHz, float fOutputHz, uint8_t cChannels, uint8_t cBitDepth)
+    int AddAudioTrack(uint16_t uHz, uint8_t cChannels, uint8_t cBits)
     {
 #ifdef VBOX_WITH_LIBOPUS
@@ -395,6 +405,9 @@
         m_lstTracks.push_back(TrackAudio);
 
+        if (uHz >= 44100)
+            uHz = 48000;
+
         /** @todo Resolve codec type. */
-        OpusPrivData opusPrivData;
+        OpusPrivData opusPrivData(uHz, cChannels);
 
         m_Ebml.serializeUnsignedInteger(TrackUID, TrackAudio.uID, 4)
@@ -402,9 +415,10 @@
               .serializeString(CodecID, "A_OPUS")
               .serializeData(CodecPrivate, &opusPrivData, sizeof(opusPrivData))
+              .serializeUnsignedInteger(CodecDelay, 0)
+              .serializeUnsignedInteger(SeekPreRoll, 80000000)
               .subStart(Audio)
-              .serializeFloat(SamplingFrequency, fSamplingHz)
-              .serializeFloat(OutputSamplingFrequency, fOutputHz)
-              .serializeUnsignedInteger(Channels, cChannels)
-              .serializeUnsignedInteger(BitDepth, cBitDepth)
+                  .serializeFloat(SamplingFrequency,       (float)uHz)
+                  .serializeUnsignedInteger(Channels,      cChannels)
+                  .serializeUnsignedInteger(BitDepth,      cBits)
               .subEnd(Audio)
               .subEnd(TrackEntry);
@@ -412,5 +426,5 @@
         return VINF_SUCCESS;
 #else
-        RT_NOREF(fSamplingHz, fOutputHz, cChannels, cBitDepth);
+        RT_NOREF(uHz, cChannels, cBits);
         return VERR_NOT_SUPPORTED;
 #endif
@@ -563,4 +577,11 @@
 static uint16_t s_uTimecode = 0;
 
+        if (!m_fClusterOpen)
+        {
+            m_Ebml.subStart(Cluster)
+                  .serializeUnsignedInteger(Timecode, 0);
+            m_fClusterOpen = true;
+        }
+
         return writeSimpleBlockInternal(0 /** @todo FIX! */, s_uTimecode++, pvData, cbData, 0 /* Flags */);
     }
@@ -759,7 +780,7 @@
 }
 
-int WebMWriter::AddAudioTrack(float fSamplingHz, float fOutputHz, uint8_t cChannels, uint8_t cBitDepth)
-{
-    return m_pImpl->AddAudioTrack(fSamplingHz, fOutputHz, cChannels, cBitDepth);
+int WebMWriter::AddAudioTrack(uint16_t uHz, uint8_t cChannels, uint8_t cBitDepth)
+{
+    return m_pImpl->AddAudioTrack(uHz, cChannels, cBitDepth);
 }
 
Index: /trunk/src/VBox/Main/src-client/EbmlWriter.h
===================================================================
--- /trunk/src/VBox/Main/src-client/EbmlWriter.h	(revision 65280)
+++ /trunk/src/VBox/Main/src-client/EbmlWriter.h	(revision 65281)
@@ -110,5 +110,5 @@
     int Close(void);
 
-    int AddAudioTrack(float fSamplingHz, float fOutputHz, uint8_t cChannels, uint8_t cBitDepth);
+    int AddAudioTrack(uint16_t uHz, uint8_t cChannels, uint8_t cBits);
 
     int AddVideoTrack(uint16_t uWidth, uint16_t uHeight, double dbFPS);
