Преобразование c в c # (метод libvlc с использованием smem)

#c# #c #vlc #libvlc

#c# #c #vlc #libvlc

Вопрос:

Я пытаюсь преобразовать код C здесь: http://wiki.videolan.org/Stream_to_memory_ (smem)_tutorial в C # для проекта с открытым исходным кодом (ispy).

Моей главной проблемой на данный момент является преобразование сигнатуры метода:

void handleStream(void* p_audio_data, uint8_t* p_pcm_buffer, unsigned int channels, unsigned int rate, unsigned int nb_samples, unsigned int bits_per_sample, unsigned int size, int64_t pts )

в эквивалент C #. Есть идеи?

Комментарии:

1. Это обратный вызов , означающий, что код C должен его вызвать. То, как вы это реализуете, зависит от того, как работает остальной код.

Ответ №1:

Если это обратный вызов, я бы сделал его делегатом C #:

 public delegate void handleStream (byte[] p_audio_data, uint[] p_pcm_buffer, 
                                   uint channels, uint rate, uint nb_samples, 
                                   uint bits_per_sample, uint size, ulong pts);
  

Комментарии:

1. Неясно, как это будет работать. Как код взаимодействия узнает, насколько велики эти массивы?

2. не работает — я почти уверен, что void * p_audio_data должен переводиться в IntPtr p_audio_data, а не byte[] (поскольку это указатель). Также есть другой метод: void prepareRender (void * p_audio_data, uint8_t ** pp_pcm_buffer , unsigned int size), который я должен перевести на c # — я думаю, что uint8_t переводится в byte[], но не знаю, как обрабатывать ** — это указатель на указатель? Мой c очень заржавел…

3.@Sean, byte[] это указатель, и он указывает на массив. uint8_t является byte в C #. @Gabe, у тебя есть количество сэмплов, скорость (сэмплы в секунду / канал) и количество каналов, так что ты знаешь, какого объема должны быть аудиоданные. Во всяком случае, у вас слишком много информации.

4. void* p_audio_data на самом деле может быть преобразован в void* p_audio_data в c #. Я думаю, что uint8_t ** является указателем на указатель и поэтому требует некоторой сортировки…

Ответ №2:

.NET-оболочка для libvlc существует по адресу http://sourceforge.net/projects/libvlcnet /, вероятно, вам следует использовать это и позволить ему обрабатывать детали P / Invoke .

Комментарии:

1. Использование предварительно написанной оболочки — отличная идея, но знаете ли вы, что задача OP на самом деле обрабатывается этой библиотекой?

2. Это не так — и да, я использую библиотеку-оболочку nVLC, которая тоже этого не делает : (

3. @Sean: Вы должны опубликовать описание (или ссылку на него) того, как должен работать обратный вызов, чтобы мы могли определить его правильное объявление.

4. Я думал, что в первом сообщении у меня была ссылка

Ответ №3:

Также существует Vlc.DotNet

В проекте есть Vlc.DotNet.Core.Библиотека взаимодействий, которая обеспечивает взаимодействие VLC для всех версий VLC >= 1.1