#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