Почему MediaElement не воспроизводит MediaStreamSource (в SilverLight)? - PullRequest
2 голосов
/ 12 ноября 2011

Когда я пытаюсь транслировать звук с моего микрофона, мне нужно получить его через MediaStreamSource.Поэтому сначала мне нужно реализовать MediaStreamSource для волнового формата pcm, который я получаю от своего микрофона.Есть по крайней мере два метода, которые, я думаю, мне нужно реализовать.Сначала

protected override void OpenMediaAsync() {
   // Create description
   Dictionary<MediaStreamAttributeKeys, string> streamAttributes = new Dictionary<MediaStreamAttributeKeys, string>();
   streamAttributes[MediaStreamAttributeKeys.CodecPrivateData] = output.CodecPrivateData;
   audioDesc = new MediaStreamDescription(MediaStreamType.Audio, streamAttributes);

   // register stream
   Dictionary<MediaSourceAttributesKeys, string> sourceAttributes = new Dictionary<MediaSourceAttributesKeys, string>();
   List<MediaStreamDescription> availableStreams = new List<MediaStreamDescription>();

   availableStreams.Add(audioDesc);
   sourceAttributes[MediaSourceAttributesKeys.Duration] = TimeSpan.FromMinutes(0).Ticks.ToString(); // whatever I put here I get the same result.
   sourceAttributes[MediaSourceAttributesKeys.CanSeek] = false.ToString();

   ReportOpenMediaCompleted(sourceAttributes, availableStreams);
}

Это работает очень хорошо.Мои CodecPrivateData '01000100401F0000803E0000020010000000' (PCM 1 канал 16 бит 8 кГц).Этот метод вызывается установкой источника следующим образом:

WaveMediaStreamSource WaveStream = new WaveMediaStreamSource(output);
mediaElement.SetSource(WaveStream);
mediaElement.Play(); 

После Play() абсолютно ничего не происходит.Я бы предложил, чтобы mediaElement хотя бы раз вызвал метод GetSampleAsync() из MediaStreamSource.Но это не так.Я заметил, что MediaElement больше не вызывает MediaStreamSource.

В то время как OpenMediaAsync mediaElement.CurrentState равен Opening.После этого он превращается в Playing, но не играет.И тогда оно больше не меняется и остается Playing.

Любые идеи?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Некоторые вещи, которые нужно попробовать ...

Попробуйте установить CanSeek в «0» и попробуйте длительность больше нуля, любое жестко закодированное значение хорошо, по крайней мере, попытайтесь заставить его работать.Также дважды проверьте строку CodecPrivateData и убедитесь, что она правильная.

Вы также можете попробовать добавить Mp3MediaStreamSource из проекта ManagedMediaHelpers и сначала убедиться, что все остальное в вашемприложение настроено правильно, затем переключитесь обратно на свой собственный MediaStreamSource.

2 голосов
/ 14 ноября 2011

Чтобы разобраться в этом, вам нужно проверить MediaElement.CurrentState - он скажет вам, на каком этапе взаимодействия с MediaStreamSource застрял MediaElement.Это, в свою очередь, скажет, какой из ваших MediaStreamSource методов должен быть реализован по-разному ...

Подробное описание, включая важную информацию о буферизующей части, см. http://msdn.microsoft.com/en-us/library/hh180779%28v=vs.95%29.aspx

1 голос
/ 01 декабря 2012

При разработке mediaElement для Windows Phone (WP7.5 и WP8) по совершенно не зависящей от меня причине отладчик не будет прерываться ни на каких точках останова в обратном вызове GetSampleAsync при первом вызове обратного вызова!

Отладчик остановится в следующий раз, когда будет достигнута точка останова. Попробуйте заменить ваш GetSampleAsync следующим:

protected override void GetSampleAsync(MediaStreamType mediaStreamType)
    {
        System.Diagnostics.Debug.WriteLine("Yay!");

        MediaStreamSample msSamp = new MediaStreamSample(
          _videoDesc, _frameStream, _frameStreamOffset,
          _frameBufferSize, _currentTime, _emptySampleDict);

        ReportGetSampleCompleted(msSamp);
    }
...