blackmagic SDK en c#

j'essaie de capturer des vidéos 720p à partir d'un blackmagic intensity pro cartes à l'aide du nouveau SDK (juin 2011) sur windows7 x64 et avec C# + VS 2010 express.

j'ai compilé et exécuté avec succès un programme qui capture les images à la YUV cependant, la capture s'arrête au bout de 56 images (la fonction de callback qui cesse d'être appelé). je me demande si je suis absent quelque chose de simple ici? surtout étant donné que je suis presque là - je obtenir des images avec le bon contenu à la bonne taille, etc, mais seulement pour un bref moment.

aussi à d'autres informations qui pourraient être utiles:

  • si je débranchez l'appareil de capture ne s'arrête pas
  • j'ai aussi essayé en 1080i, et PAL et la même chose arrive
  • même chose se produit même si le VideoInputFrameArrived fonction est vide (c'est à dire avec juste un compteur de trames)

voici le code:


public partial class MainWindow : Window , IDeckLinkInputCallback
{
private IDeckLinkIterator   _deckLinkIterator;
private List<IDeckLink>     _deckLinkList = new List<IDeckLink>();
private IDeckLink           _currentDevice=null;
private IDeckLinkInput      _deckLinkInput = null;
private int _width=1280;
private int _height=720;
private WriteableBitmap _writeableBitmap =null;
IntPtr _tempRGBData;
byte[] _tempRGBDataBytes;
DispatcherTimer _timer = new DispatcherTimer();
public MainWindow()
{
InitializeComponent();
}
Random _random = new Random();
void _timer_Tick(object sender, EventArgs e)
{
_random.NextBytes(_tempRGBDataBytes);
_writeableBitmap.WritePixels(new Int32Rect(0, 0, _width, _height),_tempRGBData, _height * _width * 3, _width * 3);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_writeableBitmap = new WriteableBitmap(_width, _height, 72, 27, PixelFormats.Bgr24, null);
_captureImage.Source = _writeableBitmap;
_tempRGBData = Marshal.AllocHGlobal(3 * _width * _height * Marshal.SizeOf(typeof(byte)));
_tempRGBDataBytes = new byte[3 * _width * _height];
_deckLinkIterator = new CDeckLinkIterator();
IDeckLink dl=null;
while(true)
{
_deckLinkIterator.Next(out dl);
if(dl==null)
{
break;
}
else
{
_deckLinkList.Add(dl);
}
}
foreach (IDeckLink device in _deckLinkList)
{
String name;
device.GetModelName(out name);
Console.WriteLine("" + name);
}
_currentDevice = _deckLinkList[1];
_deckLinkInput = (IDeckLinkInput)_currentDevice;
uint frameCount=0;
_deckLinkInput.GetAvailableVideoFrameCount(out frameCount);
Console.WriteLine("available frame count: " + frameCount);
IDeckLinkDisplayModeIterator displayIterator=null;
_deckLinkInput.GetDisplayModeIterator(out displayIterator);
_BMDDisplayModeSupport displayModeSupport;
IDeckLinkDisplayMode displayMode=null;
_BMDDisplayMode setDisplayMode      = _BMDDisplayMode.bmdModeHD720p50;
_BMDPixelFormat setPixelFormat      = _BMDPixelFormat.bmdFormat8BitYUV;
_BMDVideoInputFlags setInputFlag    = _BMDVideoInputFlags.bmdVideoInputFlagDefault;
_deckLinkInput.DoesSupportVideoMode(setDisplayMode, setPixelFormat, setInputFlag, out displayModeSupport, out displayMode);
try
{
//_deckLinkInput.DisableAudioInput();
_deckLinkInput.EnableVideoInput(setDisplayMode, setPixelFormat, setInputFlag);
}
catch (Exception em)
{
Console.WriteLine("deck link init failed: " + em.Message);
}
_deckLinkInput.SetCallback(this);
Console.WriteLine("done!");
_timer.Interval = TimeSpan.FromSeconds(1f / 30f);
_timer.Tick += new EventHandler(_timer_Tick);
_timer.Start();
}
int frameCount = 0;
public void VideoInputFrameArrived(IDeckLinkVideoInputFrame video, IDeckLinkAudioInputPacket audio)
{
//get image data
IntPtr pData;
video.GetBytes(out pData);
//keeping it simple so just counting frames - this gets called 56 times then stops
Console.WriteLine("video frame arrived!! " + frameCount);
frameCount++;
}
public void  VideoInputFormatChanged(_BMDVideoInputFormatChangedEvents events, IDeckLinkDisplayMode displayMode, _BMDDetectedVideoInputFormatFlags flags)
{
Console.WriteLine("video format changed!!");
}
//start stream
private void button1_Click(object sender, RoutedEventArgs e)
{
_deckLinkInput.StartStreams();
}
//stop stream
private void button2_Click(object sender, RoutedEventArgs e)
{
_deckLinkInput.StopStreams();
}
private void button4_Click(object sender, RoutedEventArgs e)
{
_deckLinkInput.PauseStreams();
}
private void button3_Click(object sender, RoutedEventArgs e)
{
_deckLinkInput.FlushStreams();
}
}
vidéo.GetBytes() les odeurs de poisson. Vous avez sûrement dire que l'appareil que vous avez fini d'utiliser le retour de l'image.
oui, bien sûr. j'ai laissé vide. le problème est que la fonction de ce qui est à l'intérieur ( le rappel ) cesse d'avoir à intervenir après un certain temps.
Bien sûr, il s'arrête quand il est à court de mémoire. Cette API est trop obscur, contactez le fournisseur de soutien.
désolé, mais où avez-vous trouver des références pour Decklink en c#?

OriginalL'auteur morishuz | 2011-06-15