Il presente articolo è stato tradotto automaticamente.
Windows Phone 7
Utilizzo della fotocamera nell'applicazione per Windows Phone
Immagini in grado di comunicare con un'efficienza ed eleganza che non può essere eguagliata da sole parole.Avete sentito che "una foto vale mille parole"; Immaginate i tipi di problemi che potrebbe risolvere se l'applicazione Windows Phone avuto accesso diretto a una telecamera.Beh, a partire da Windows Phone 7.5, è possibile iniziare risolvere quei problemi di "mila-parola" utilizzando le telecamere sul dispositivo.
In questo articolo, I'll introdurre la parte anteriore e telecamere, la fotocamera API e le funzionalità associate manifesta di nuovo, più che tratterò alcuni modi diversi, è possibile utilizzare una fotocamera nell'applicazione Windows Phone 7.5 successivo.Mi occuperò:
- Catturare foto: Creerò una foto molto semplice app.
- L'accesso a buffer anteprima fotocamera: I'll introdurre il campione di fotocamera in scala di grigi.
- Video registrazione: ' Ll rivedere il Video registratore campione.
Sarà necessario il Windows Phone SDK 7.1 per creare un'applicazione Windows Phone 7.5.il SDK include esempi di codice che illustrano ciascuno di questi scenari in grande dettaglio.Per ulteriori informazioni, vedere l'esempio base di fotocamera, fotocamera in scala di grigi campione e il campione di registratore Video sulla pagina esempi di codice in SDK a wpdev.ms/officialsamples.
Si noti che questo articolo non coprirà l'attività di cattura della fotocamera, che è stato disponibile dal Windows Phone 7.Anche se questa attività è un modo semplice per acquisire foto per la vostra applicazione, esso non consente di catturare foto a livello di programmazione o accedere il buffer di anteprima della fotocamera.
Un dispositivo Windows Phone 7.5 può includere fino a due telecamere, designate come primario e frontale.Fotocamera principale è sul retro del dispositivo e in genere offre una risoluzione più alta e più funzioni rispetto la fotocamera frontale.Nessuna di queste telecamere è necessaria su un dispositivo Windows Phone 7.5, quindi assicuratevi di controllare per la loro presenza nel codice, prima si creano gli oggetti della fotocamera.In seguito illustrerò come utilizzare il metodo statico IsCameraTypeSupported per questo scopo.
Molti dei dispositivi Windows Phone disponibili negli Stati Uniti includono una fotocamera principale con un 5MP o sensore maggiore, autofocus e flash.La fotocamera frontale è una nuova funzionalità per Windows Phone 7.5.
Per ulteriori informazioni sulle specifiche del dispositivo, vedere la scheda di acquistare presso windowsphone.com.
Catturare foto
È possibile utilizzare le stesse classi per accedere sia la fotocamera principale e la fotocamera frontale.Come si vedrà, selezionando il tipo di macchina fotografica è semplicemente una questione di specificando un singolo parametro nel costruttore dell'oggetto fotocamera.Da una prospettiva di progettazione, tuttavia, si potrebbe voler gestire l'interazione con la fotocamera frontale in modo diverso.Ad esempio, si potrebbe voler capovolgere le immagini dalla fotocamera frontale per dare all'utente un'esperienza più naturale "mirror-like".
Quando l'acquisizione di foto in un app Windows Phone 7.5, lavorerete principalmente con la classe fotocamera dallo spazio dei nomi Microsoft.Devices.Questa classe offre una grande quantità di controllo sul comportamento e le impostazioni della fotocamera.Ad esempio, è possibile:
- Attivare l'otturatore della fotocamera con il metodo PhotoCamera.CaptureImage
- Messa a fuoco automatica grilletto con il metodo PhotoCamera.Focus
- Specificare la risoluzione di immagine impostando la proprietà foto-Camera.Resolution
- Specificare le impostazioni di flash impostando la proprietà foto-Camera.FlashMode
- Incorporare il pulsante dell'otturatore di hardware con eventi dalla classe statica CameraButtons
- Implementare touch focus con il PhotoCamera.FocusAtPoint metodo
In questo articolo illustrerò solo il primo punto.Per un esempio che mostra come fare tutti questi, vedere esempio di macchina fotografica base dalla pagina di campioni del codice Windows Phone SDK.
Si noti che anche quando una fotocamera è disponibile, potrebbe supporta tutte queste API.I seguenti approcci possono aiutare a determinare ciò che è disponibile:
- Fotocamera: Utilizzare il metodo statico PhotoCamera.IsCameraTypeSupported.
- Messa a fuoco automatica: Utilizzare il PhotoCamera.IsFocus-supportato il metodo.
- Impostazioni di risoluzione di immagine: Controllare la foto-Camera.AvailableResolutions insieme.
- Impostazioni di Flash: Utilizzare il PhotoCamera.IsFlashModesupportato il metodo.
- Specifiche del punto di messa a fuoco: Utilizzare il PhotoCamera.IsFocusAtPointSupported metodo.
Per darvi un'idea di come acquisire foto nella tua applicazione, camminiamo attraverso un semplice app che cattura una foto quando si tocca il mirino e quindi salva nella cartella nell'Hub foto rullo della macchina fotografica.
Iniziare con un progetto di Windows Phone standard, utilizzando il modello di applicazione di Windows Phone.È possibile scrivere applicazioni Windows Phone 7.5 in c# o Visual Basic.Questo esempio verrà utilizzato c#.
Potrai semplificare la questo esempio limitando il app per un orientamento di paesaggio e utilizzando solo la fotocamera principale.Gestione di orientamento per il dispositivo e due telecamere, ciascuno ha sottolineato in direzioni diverse, può diventare confusa abbastanza rapidamente; Raccomando test con un dispositivo fisico affinché che si raggiungere il comportamento desiderato.Mi occuperò di orientamento più in dettaglio più avanti.
Su MainPage, aggiornare gli attributi PhoneApplicationPage come segue:
SupportedOrientations="Landscape" Orientation="LandscapeLeft"
Quindi, sostituire il contenuto della griglia LayoutRoot con tela e TextBlock, come mostrato nella Figura 1.
Figura 1 aggiungendo una tela e un oggetto TextBlock
<Canvas x:Name="viewfinderCanvas" Width="640" Height="480" Tap="viewfinder_Tapped">
<Canvas.Background>
<VideoBrush x:Name="viewfinderBrush">
<VideoBrush.RelativeTransform>
<CompositeTransform
x:Name="viewfinderTransform"
CenterX="0.5"
CenterY="0.5"/>
</VideoBrush.RelativeTransform>
</VideoBrush>
</Canvas.Background>
</Canvas>
<TextBlock Width="626" Height="40"
HorizontalAlignment="Left"
Margin="8,428,0,0"
Name="txtMessage"
VerticalAlignment="Top"
FontSize="24"
FontWeight="ExtraBold"
Text="Tap the screen to capture a photo."/>
Il codice XAML in Figura 1 un VideoBrush viene utilizzata in una tela per visualizzare il mirino e fornisce un oggetto TextBlock per comunicare con l'utente. Il sensore della fotocamera ha un rapporto di formato 4:3, e le proporzioni dello schermo è 15:9. Se non si specifica una dimensione di tela con lo stesso rapporto 4:3 (640 x 480), l'immagine apparirà allungato attraverso lo schermo.
Nell'elemento Canvas, l'attributo Tap specifica il metodo da chiamare quando l'utente rubinetti schermo — il metodo viewfinder_Tapped. Per visualizzare il flusso di immagini dal buffer di anteprima di macchina fotografica, un Videopennello denominato viewfinderBrush è specificato come lo sfondo dell'area di disegno. Come un mirino da una fotocamera di (SLR) single lens reflex, viewfinderBrush consente di vedere i fotogrammi di anteprima di fotocamera. La trasformazione in viewfinderBrush essenzialmente "pin" il mirino al centro della tela come esso è ruotato. Tratterò il codice dietro questo codice XAML nelle sezioni seguenti. Figura 2 mostra foto App interfaccia utente semplice.
Nella figura 2 l'interfaccia utente di semplice foto App
Inizializzazione e rilasciare la fotocamera per catturare foto e salvarli nella cartella rullo della macchina fotografica nell'Hub foto, avrete bisogno delle classi fotocamera e MediaLibrary, rispettivamente. Iniziare aggiungendo un riferimento all'assembly Microsoft.Xna.Framework. Non hai bisogno di sapere XNA programmazione per questo esempio; dovete tipi in questa Assemblea, però, accedere alla libreria multimediale.
All'inizio del file MainPage.xaml.cs, aggiungere le direttive per la macchina fotografica e media libreria:
using Microsoft.Devices;
using Microsoft.Xna.Framework.Media;
Nella classe MainPage, aggiungere le seguenti variabili a livello di classe:
private int photoCounter = 0;
PhotoCamera cam;
MediaLibrary library = new MediaLibrary();
La telecamera può prendere pochi secondi per inizializzare. Dichiarando l'oggetto fotocamera a livello di classe, è possibile crearlo quando si naviga alla pagina e rimuoverlo dalla memoria quando si naviga lontano. Useremo i metodi OnNavigatedTo e OnNavigatingFrom per questo scopo.
Nel metodo OnNavigatedTo, creare l'oggetto fotocamera, registrarsi per gli eventi di fotocamera che saranno utilizzati ed impostare l'anteprima della fotocamera come origine del mirino, viewfinderBrush. Anche se comune, le telecamere sono facoltative in Windows Phone 7.5; è importante controllare per loro, prima si crea l'oggetto della fotocamera. Se la fotocamera principale non è disponibile, il metodo scrive un messaggio per l'utente.
Aggiungere i metodi illustrati Figura 3 alla classe MainPage.
Nella figura 3, I metodi di OnNavigatingFrom e OnNavigatedTo
protected override void OnNavigatedTo
(System.Windows.Navigation.NavigationEventArgs e)
{
if (PhotoCamera.IsCameraTypeSupported(CameraType.Primary) == true)
{
cam = new PhotoCamera(CameraType.Primary);
cam.CaptureImageAvailable +=
new EventHandler<Microsoft.Devices.ContentReadyEventArgs>
(cam_CaptureImageAvailable);
viewfinderBrush.SetSource(cam);
}
else
{
txtMessage.Text = "A Camera is not available on this device.";
}
}
protected override void OnNavigatingFrom
(System.Windows.Navigation.NavigatingCancelEventArgs e)
{
if (cam != null)
{
cam.Dispose();
}
}
Durante la navigazione dalla pagina, utilizzare il metodo OnNavigatingFrom per eliminare l'oggetto fotocamera e annullare la registrazione di eventi di fotocamera. Questo aiuta a minimizzare il consumo di potenza, accelerare l'arresto e il rilascio di memoria.
Acquisizione di una foto come mostrato nel codice XAML, quando l'utente rubinetti sul mirino, viene chiamato il metodo viewfinder_Tapped. Questo metodo avvia la cattura dell'immagine quando la fotocamera è pronta. Se la fotocamera non ha ancora inizializzato oppure è attualmente in fase di acquisizione di un'altra immagine, verrà generata un'eccezione. Per attenuare le eccezioni, si consideri la disattivazione dei meccanismi che scatenano catturare foto fino a quando viene generato l'evento Initialized. Per mantenere le cose semplici in questo esempio, noi ti saltare questo passo.
Figura 4 mostra il codice è necessario aggiungere alla classe MainPage.
Figura 4 viewfinder_Tapped metodo.
void viewfinder_Tapped(object sender, GestureEventArgs e)
{
if (cam != null)
{
try
{
cam.CaptureImage();
}
catch (Exception ex)
{
this.Dispatcher.BeginInvoke(delegate()
{
txtMessage.Text = ex.Message;
});
}
}
}
Acquisizione delle foto e salvandolo sono sforzi asincroni. Quando viene chiamato il metodo CaptureImage, avvia una catena di eventi e controllo viene passato torna all'interfaccia utente. Come mostrato nel caso in cui il diagramma di sequenza in Figura 5, ci sono due fasi per ogni acquisizione dell'immagine. In primo luogo, il sensore della fotocamera acquisisce la foto e poi immagini vengono creati in base ai dati di sensore.
Figura 5 la sequenza di eventi di acquisizione delle immagini della classe icone PhotoCamera
Salvare una foto dopo il sensore acquisisce la foto, l'immagine di due file vengono creati in parallelo, un file di immagine full-size e una miniatura. Sei alcun obbligo di utilizzare entrambi. Ognuno è disponibile come un flusso di immagini JPG dalla proprietà e.ImageStream gli argomenti degli eventi corrispondenti.
La libreria multimediale crea automaticamente le proprie miniature per la visualizzazione nell'Hub foto del dispositivo, quindi in questo esempio non ha bisogno della versione miniatura dell'immagine. Tuttavia, se si desidera visualizzare un'anteprima nella tua propria applicazione, e.ImageStream dalla catturaThumbnailAvailable gestore eventi sarebbe una scelta efficiente.
Quando il flusso è disponibile, è possibile utilizzare per salvare l'immagine in varie località. Di seguito è riportato un esempio di utilizzo di questo attributo.
- Cartella di fotocamera Roll: Utilizzare il metodo MediaLibrary.SavePictureToCameraRoll.
- Cartella immagini salvata: Utilizzare il MediaLibary.Save-foto di metodo.
- Archiviazione isolata: Utilizzare l'oggetto IsolatedStorageFile-Stream.Write metodo.
In questo esempio, salveremo l'immagine nella cartella del rotolo di fotocamera. Per un esempio di come salvare un'immagine all'archiviazione isolata, vedere l'esempio di macchina fotografica base in Windows Phone SDK. Aggiungere il codice in Figura 6 alla classe MainPage.
Figura 6 salvare un'immagine alla fotocamera Roll cartella
void cam_CaptureImageAvailable(object sender,
Microsoft.Devices.ContentReadyEventArgs e)
{
photoCounter++;
string fileName = photoCounter + ".jpg";
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
txtMessage.Text = "Captured image available, saving picture.";
});
library.SavePictureToCameraRoll(fileName, e.ImageStream);
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
txtMessage.Text = "Picture has been saved to camera roll.";
});
}
Nel codice in Figura 6, i messaggi vengono inviati all'interfaccia utente, prima e dopo l'immagine viene salvata nella cartella rullo della macchina fotografica. Questi messaggi sono semplicemente che aiuta a capire cosa sta succedendo; non sono richiesti. Il metodo BeginInvoke è necessario far passare il messaggio al thread dell'interfaccia utente. Se non utilizzi BeginInvoke, verrebbe generata un'eccezione di filettatura. Per brevità, questo metodo manca il codice di gestione degli errori.
Gestione di RotationWhen si salva un'immagine per la libreria multimediale, l'orientamento corretto dell'immagine sarà notato nelle informazioni EXIF del file. La preoccupazione principale della vostra applicazione è come l'anteprima della telecamera è orientato nell'interfaccia utente. Per mantenere l'anteprima che appaiono con l'orientamento corretto, ruotare il mirino (VideoBrush), come applicabile. Rotazione avviene mediante l'override del metodo virtuale OnOrientationChanged. Aggiungere il codice in Figura 7 alla classe MainPage.
Figura 7 si esegue l'override del metodo virtuale OnOrientationChanged
void cam_CaptureImageAvailable(object sender,
Microsoft.Devices.ContentReadyEventArgs e)
{
photoCounter++;
string fileName = photoCounter + ".jpg";
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
txtMessage.Text = "Captured image available, saving picture.";
});
library.SavePictureToCameraRoll(fileName, e.ImageStream);
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
txtMessage.Text = "Picture has been saved to camera roll.";
});
}
protected override void OnOrientationChanged
(OrientationChangedEventArgs e)
{
if (cam != null)
{
Dispatcher.BeginInvoke(() =>
{
double rotation = cam.Orientation;
switch (this.Orientation)
{
case PageOrientation.LandscapeLeft:
rotation = cam.Orientation - 90;
break;
case PageOrientation.LandscapeRight:
rotation = cam.Orientation + 90;
break;
}
viewfinderTransform.Rotation = rotation;
});
}
base.OnOrientationChanged(e);
}
Senza alcun aggiustamento dell'orientamento del mirino, il mirino per un tipico fotocamera principale apparirà orientato correttamente solo quando il pulsante dell'otturatore hardware è rivolto verso l'alto (LandscapeLeft). Se si ruota il dispositivo tale che il pulsante dell'otturatore hardware è rivolta verso il basso (LandscapeRight), il mirino deve essere ruotata di 180 gradi per visualizzare correttamente nell'interfaccia utente. La proprietà Orientation fotocamera è qui utilizzata nel caso in cui l'orientamento fisico della fotocamera principale è atipica.
Dichiarando applicazione funzionalità infine, quando tua applicazionecazione utilizza una telecamera, è necessario dichiarare che lo fa nel file di manifesto dell'applicazione, WMAppManifest. xml. Non importa quale macchina fotografica viene utilizzato, sarà necessario la capacità ID_CAP_ISV_CAMERA. Facoltativamente, è possibile utilizzare la ID_HW_FRONTCAMERA per indicare che l'applicazione richiede una fotocamera frontale:
<Capability Name="ID_CAP_ISV_CAMERA"/>
<Capability Name="ID_HW_FRONTCAMERA"/>
Vostra macchina fotografica app non verrà eseguito senza la capacità ID_CAP_ISV_CAMERA.Se non hanno avuto un problema in esecuzione di finora, è perché questa funzionalità viene aggiunto automaticamente a nuovi progetti di Windows Phone.Se stiate aggiornando la tua applicazione, però, è necessario aggiungerlo manualmente.ID_HW_FRONTCAMERA deve sempre essere aggiunti manualmente, ma la sua mancanza non impedirà la tua applicazione da corsa.
Queste capacità aiutano avvertire gli utenti che non hanno una macchina fotografica sul proprio dispositivo, ma nulla impedisce loro dal download e acquisto la vostra applicazione.Per questo motivo, è una buona idea di rendere disponibile una versione di prova della vostra applicazione.Quindi, se gli utenti non perdere le avvertenze, non spendere soldi solo per apprendere che l'applicazione non funzionerà come previsto sul proprio dispositivo.Valutazioni di app verranno ringrazio più tardi.
Se non avete fatto ancora, premere F5 e debug questo app semplice fotocamera sul tuo dispositivo.Poter eseguire il debug l'applicazione nell'emulatore, ma si vedrà solo una scatola nera movimento intorno allo schermo, perché l'emulatore non ha una fotocamera fisica.Quando il debug con un dispositivo, tenere a mente che Impossibile visualizzare le immagini di nuove nell'Hub foto fino a quando non si untether il dispositivo dal tuo PC.
Per andare più in profondità, dare un'occhiata il campione di fotocamera base in Windows Phone SDK.Che esempio viene illustrato l'API completa per l'acquisizione di foto: dalla regolazione delle impostazioni di flash e risoluzione per integrare touch messa a fuoco e il pulsante dell'otturatore di hardware.
L'accesso ai Buffer di anteprima di fotocamera
Nell'esempio precedente, i fotogrammi dal buffer anteprima fotocamera erano in streaming al mirino.La classe fotocamera espone anche il frame corrente del buffer anteprima per consentire la manipolazione di pixel di ogni frame.Diamo un'occhiata a un campione da Windows Phone SDK per vedere come possiamo manipolare fotogrammi dal buffer anteprima e visualizzarle su una bitmap scrivibile nell'interfaccia utente.
La classe fotocamera espone il frame corrente del buffer anteprima con i seguenti metodi di "ottenere anteprima":
- GetPreviewBufferArgb32: Matrice di valori integer del fotogramma corrente nel formato ARGB
- GetPreviewBufferYCbCr: Matrice di byte del fotogramma corrente nel formato YCbCr
- GetPreviewBufferY: Matrice di byte di luminanza piano solo, in un formato simile
ARGB è il formato utilizzato per descrivere il colore nelle applicazioni Silverlight per Windows Phone.YCbCr consente l'elaborazione efficiente di immagine, ma Silverlight non è possibile utilizzare YCbCr.Se si desidera manipolare una cornice YCbCr nell'applicazione, è necessario convertire il telaio in ARGB prima può essere visualizzato.Per ulteriori informazioni su questi formati e la conversione del colore, vedere la pagina MSDN Library, "Conversione fotocamera del colore (YCbCr a ARGB) per Windows Phone," a wpdev.ms/colorconversion.
L'esempio di scala di grigi fotocamera da Windows Phone SDK (vedere Figura 8) viene illustrato come manipolare i fotogrammi ARGB dal buffer anteprima e scriverle in un'immagine bitmap scrivibile in quasi tempo reale.In questo esempio, ogni fotogramma viene convertito da colore a scala di grigi.Si noti che l'obiettivo di questo esempio è per dimostrare la manipolazione ARGB; Se l'applicazione deve solo in scala di grigi, è consigliabile utilizzare il metodo GetPreviewBufferY invece.
Figura 8 la fotocamera in scala di grigi campione UI
Nel file XAML, un tag di immagine è utilizzato per ospitare la bitmap scrivibile corrispondente (l'immagine in bianco e nero nell'angolo in basso a sinistra dell'interfaccia utente), come segue:
<Image x:Name="MainImage"
Width="320" Height="240"
HorizontalAlignment="Left" VerticalAlignment="Bottom"
Margin="16,0,0,16"
Stretch="Uniform"/>
Quando si preme un pulsante per consentire la conversione in scala di grigi, un nuovo thread viene creato per eseguire l'elaborazione; una bitmap scrivibile, avendo le stesse dimensioni del buffer di anteprima, viene creata e assegnata come la fonte del controllo immagine:
wb = new WriteableBitmap(
(int)cam.PreviewResolution.Width,
(int)cam.PreviewResolution.Height);
this.MainImage.Source = wb;
Il thread esegue il suo lavoro nel metodo PumpARGBFrames. Lì, una matrice di valori integer denominata ARGBPx viene utilizzata per contenere un'istantanea del buffer anteprima corrente. Ognuno di questi valori nella matrice rappresenta un pixel del fotogramma, in formato ARGB. Questa matrice viene creata anche con le stesse dimensioni del buffer di anteprima:
int[] ARGBPx = new int[
(int)cam.PreviewResolution.Width *
(int)cam.PreviewResolution.Height];
Mentre è attivata la funzionalità "grigi" del campione, il thread copia il frame corrente nel buffer dell'anteprima per la matrice di ARGBPx. Qui, phCam è l'oggetto della fotocamera:
phCam.GetPreviewBufferArgb32(ARGBPx);
Una volta che il buffer è stato copiato nella matrice, il filo scorre ogni pixel e lo converte in scala di grigi (vedere l'esempio per maggiori dettagli su come che è compiuta):
for (int i = 0; i < ARGBPx.Length; i++)
{
ARGBPx[i] = ColorToGray(ARGBPx[i]);
}
Infine, prima di elaborare il fotogramma successivo, il thread utilizza il metodo BeginInvoke per aggiornare WriteableBitmap nell'interfaccia utente. CopyTo metodo sovrascrive i pixel WriteableBitmap con la matrice di ARGBPx e le forze del metodo Invalidate WriteableBitmap per ridisegnare, come segue:
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
// Copy to WriteableBitmap.
ARGBPx.CopyTo(wb.Pixels, 0);
wb.Invalidate();
pauseFramesEvent.Set();
});
La classe WriteableBitmap consente un'ampia gamma di possibilità creative. Ora è possibile incorporare il buffer di anteprima fotocamera nel vostro repertorio di effetti visivi per l'interfaccia utente.
Registrazione Video
Anche se è possibile utilizzare la classe fotocamera per lo streaming il buffer di anteprima all'interfaccia utente, è possibile utilizzare per registrare video. Per questo, avrete bisogno di alcune classi dello spazio dei nomi System.Windows.Media. Nella parte finale di questo articolo, vedremo il campione di registratore Video da Windows Phone SDK (vedere Figura 9) per vedere come registrare video in un file MP4 nell'archiviazione isolata. Potete trovare questo esempio della pagina di esempi di codice SDK.
Nella figura 9 il Video registratore campione UI
Le classi primarie per la video registrazione sono:
- CaptureDeviceConfiguration: Utilizzare per controllare la disponibilità di un dispositivo di acquisizione video
- CaptureSource: Utilizzare per avviare e interrompere la registrazione/anteprima video
- VideoBrush: Utilizzare per riempire i controlli dell'interfaccia utente di Silverlight con un oggetto CaptureSource o fotocamera
- FileSink: Utilizzare per registrare video all'archiviazione isolata quando è in esecuzione un oggetto CaptureSource
Nel file XAML, un controllo del rettangolo viene utilizzato per visualizzare il mirino della fotocamera:
<Rectangle
x:Name="viewfinderRectangle"
Width="640"
Height="480"
HorizontalAlignment="Left"
Canvas.Left="80"/>
Un controllo di rettangolo non è necessario per visualizzare i video, tuttavia. È possibile utilizzare il controllo Canvas, come illustrato nel primo esempio. Il controllo del rettangolo viene utilizzato semplicemente per mostrare un altro modo per visualizzare il video.
A livello di pagina, le seguenti variabili vengono dichiarate:
// Viewfinder for capturing video.
private VideoBrush videoRecorderBrush;
// Source and device for capturing video.
private CaptureSource captureSource;
private VideoCaptureDevice videoCaptureDevice;
// File details for storing the recording.
private IsolatedStorageFileStream isoVideoFile;
private FileSink fileSink;
private string isoVideoFileName = "CameraMovie.mp4";
Quando un utente naviga alla pagina, il metodo di InitializeVideoRecorder inizia la fotocamera e invia l'anteprima della fotocamera al rettangolo. Dopo aver creato gli oggetti captureSource e fileSink, il metodo InitializeVideoRecorder utilizza la cattura staticaDeviceConfiguration oggetto di trovare un dispositivo video. Se nessuna telecamera è disponibile, videoCaptureDevice sarà null:
videoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
In Windows Phone 7.5, le telecamere sono facoltative. Anche se sono comuni su dispositivi di oggi, è consigliabile controllare per loro nel codice. Come Figura 10 mostra, videoCaptureDevice viene utilizzato per verificare la presenza di una telecamera. Se disponibile, captureSource è impostato come fonte di un VideoBrush denominato videoRecorderBrush e videoRecorderBrush viene utilizzato come il riempimento per il controllo di rettangolo denominato viewfinderRectangle. Quando viene chiamato il metodo Start di captureSource, la telecamera inizia l'invio di video al rettangolo.
Figura 10 visualizzazione dell'anteprima di Video
// Initialize the camera if it exists on the device.
if (videoCaptureDevice != null)
{
// Create the VideoBrush for the viewfinder.
videoRecorderBrush = new VideoBrush();
videoRecorderBrush.SetSource(captureSource);
// Display the viewfinder image on the rectangle.
viewfinderRectangle.Fill = videoRecorderBrush;
// Start video capture and display it on the viewfinder.
captureSource.Start();
// Set the button state and the message.
UpdateUI(ButtonState.Initialized, "Tap record to start recording...");
}
else
{
// Disable buttons when the camera is not supported by the device.
UpdateUI(ButtonState.CameraNotSupported, "A camera is not supported on this device.");
}
In questo esempio, un metodo di supporto denominato UpdateUI gestisce gli Stati del pulsante e scrive i messaggi per l'utente. Vedere l'esempio di registratore Video per maggiori dettagli.
Anche se l'oggetto fileSink è stato creato, nessun video è essere registrato a questo punto. Questo stato dell'applicazione viene indicato come video "anteprima". Per registrare video, fileSink bisogno di essere collegato a captureSource prima dell'avvio. In altre parole, prima è possibile registrare video, dovete smettere di captureSource.
Quando l'utente rubinetti il pulsante di registrazione nel campione video registratore, il metodo di StartVideoRecorder inizia la transizione dall'anteprima a registrazione. Il primo passo nella transizione è fermare captureSource e riconfigurare il fileSink:
// Connect fileSink to captureSource.
if (captureSource.VideoCaptureDevice != null
&& captureSource.State == CaptureState.Started)
{
captureSource.Stop();
// Connect the input and output of fileSink.
fileSink.CaptureSource = captureSource;
fileSink.IsolatedStorageFileName = isoVideoFileName;
}
Anche se le classi CaptureSource e VideoBrush potrebbero sembrare familiare se hai sviluppato applicazioni per il plug-in Silverlight, la classe FileSink è tutto nuova. Esclusiva per applicazioni di Windows Phone, la classe FileSink sa tutto di scrittura all'archiviazione isolata; tutto quello che dovete fare è fornire il nome del file.
Dopo fileSink è stato riconfigurato, il metodo StartVideoRecorder viene riavviato captureSource e aggiorna l'interfaccia utente:
captureSource.Start();
// Set the button states and the message.
UpdateUI(ButtonState.Ready, "Ready to record.");
Quando l'utente interrompe la registrazione, la transizione dalla registrazione per visualizzare in anteprima, captureSource ha bisogno di essere fermati di nuovo prima che il fileSink è riconfigurato, come mostrato nella Figura 11.
Figura 11 transizione dalla registrazione all'anteprima
// Stop recording.
if (captureSource.VideoCaptureDevice != null
&& captureSource.State == CaptureState.Started)
{
captureSource.Stop();
// Disconnect fileSink.
fileSink.CaptureSource = null;
fileSink.IsolatedStorageFileName = null;
// Set the button states and the message.
UpdateUI(ButtonState.NoChange, "Preparing viewfinder...");
StartVideoPreview();
}
La logica di inizio-video-anteprima è stata isolata in un altro metodo per consentire la transizione in anteprima da parte dello stato di riproduzione video (non trattati in questo articolo).Anche se io non coprirà la riproduzione qui, è importante notare che in Windows Phone, solo un flusso video può essere in esecuzione in un momento.
Il campione di registratore Video dispone di due flussi video separati:
- captureSource g videoRecorderBrush g viewfinderRectangle (control Rectangle)
- isoVideoFile g VideoPlayer (controllo MediaElement)
Perché in un momento di eseguire solo un flusso, questo esempio dispone di un metodo "dispose" per ogni flusso che può essere chiamato prima di altri il flusso di esecuzione.Nel DisposeVideoPlayer e Disposemetodi di videoregistratore, il flusso viene fermato da chiamando il metodo Stop sull'oggetto rispettivo (e impostando la sorgente di MediaElement su null).Gli oggetti CaptureSource e MediaElement in realtà non implementano l'interfaccia IDisposable.
A questo punto, si potrebbe pensare che il campione in scala di grigi fotocamera sembrava avere due video andando allo stesso tempo.In realtà, c'era solo un flusso video in quell'applicazione: il flusso dall'oggetto fotocamera per il controllo di VideoBrush.La scala di grigi "video" era in realtà solo una bitmap che è stata ridisegnata a un alto tasso di velocità, basato sui frame individualmente manipolati dal buffer anteprima fotocamera.
Il confezionamento di
La fotocamera API, nuovo per Windows Phone 7.5, apre la porta per una nuova razza di applicazioni che risolvere i problemi e intrattenere in modi non è possibili con le versioni precedenti del sistema operativo.Questo articolo ha toccato solo alcuni aspetti dell'API.Per il riferimento completo, vedere la sezione fotocamera e foto nella documentazione SDK di Windows Phone a wpdev.ms/cameraandphotos.
Matt Stroshane scrive la documentazione per sviluppatori per la squadra di Windows Phone. I suoi altri contributi alla MSDN Library dispongono di prodotti quali SQL Server, SQL Azure e Visual Studio. Quando non è iscritto, potreste trovare lui per le strade di Seattle, corsi di formazione per la sua prossima maratona. Seguirlo su Twitter a twitter.com/mattstroshane.
Grazie ai seguenti esperti tecnici per la revisione di questo articolo: Eric Bennett, Nikhil Deore, Adam Lydick e Jon Sheller