2012-04-25 8 views
14

Sono in grado di ottenere i dati del frame RGBA dalla fotocamera e voglio codificarlo in formato H.264. Ho usato FFmpeg per codificare e decodificare video H.264, ma con una dimensione del fotogramma di 640x480 è troppo lento per le mie esigenze.Come posso eseguire la codifica H.264 con accelerazione hardware e la decodifica per lo streaming?

Mi piacerebbe utilizzare l'accelerazione hardware per accelerare la codifica e la decodifica, quindi come farei?

Inoltre, ho bisogno di essere in grado di trasmettere il video codificato attraverso la rete e decodificarlo dall'altra parte. Come si può fare?

+0

Il titolo della domanda è ".. decodifica video", ma la vera domanda riguarda la codifica, giusto? Forse dovresti modificare il titolo? – Anastasia

+0

Esiste una libreria che consente di codificare i frame grezzi su H.264: http://www.foxitsolutions.com/iphone_h264_sdk.html. Questa libreria utilizza l'encoder hardware e offre frame H.264 separati. Si prega di vedere questa domanda e risposta: http://stackoverflow.com/questions/7979842/video-encoding-libraries-for-ios/ – Anastasia

+0

Forse un duplicato: http://stackoverflow.com/questions/25197169/how-to- decode-ah-264-frame-on-ios-by-hardware-decoding –

risposta

18

Se si desidera eseguire la codifica e decodifica video con accelerazione hardware di video H.264 su iOS, l'unica soluzione è AVFoundation. Non utilizzare librerie di terze parti per la codifica o la decodifica, poiché attualmente sono tutte collegate alla CPU e sono molto più lente di quelle ottenute da AVFoundation. L'unico motivo per utilizzare un codificatore o decodificatore di terze parti sarebbe se si utilizza un formato non supportato in iOS per impostazione predefinita.

Per la decodifica con accelerazione hardware, è consigliabile utilizzare un'istanza AVAssetReader (o una delle classi di lettore per la riproduzione pura). Con un AVAssetReader, ottengo regolarmente velocità di riproduzione 2X o superiore per la lettura di video con codifica H.264, quindi i dispositivi iOS utilizzano una buona accelerazione hardware per questo.

Analogamente, per la codifica accelerata, verrà utilizzato un AVAssetWriter. Ci sono alcuni trucchi per far sì che AVAssetWriter codifichi alla massima velocità (alimentazione nei frame BGRA, utilizzando un pool di buffer pixel, utilizzando le cache di texture di iOS 5.0 se si legge da OpenGL ES), che descrivo in dettaglio all'interno di this answer.

Se vuoi vedere un codice che utilizza i percorsi più veloci che ho trovato per la codifica e decodifica accelerate, puoi guardare il mio framework open source GPUImage, che, a differenza di quello collegato da Anastasia, è totalmente gratuito da usare .

+1

Grazie per il codice sorgente e aspetto approssimativo, ma non ho trovato la funzione oi parametri di accesso alla codifica o decodifica dei dati, ho bisogno di ottenere il codifica dei dati inviati attraverso la rete, e poi all'altra estremità del terminale equipmentdecoding, se hai già l'interfaccia o la funzione, ma non ho trovato speranza di ottenere il tuo aiuto, grazie mille – king

+1

La tua lib è ottima ma è per l'applicazione di filtri ed elaborare il video non elaborato ma non aiuta nulla con una domanda reale che è la codifica hardware. Se l'utente desidera inviare dati compressi sulla rete, nessuna delle API sopra elencate (asset reader e asset writer) non sarà di aiuto. –

+0

@king: potrebbero essere i dettagli che si desidera aggiungere alla domanda, poiché non è stato specificato che si desidera accedere ai flussi di input e output non elaborati per il trasferimento attraverso la rete. La mia risposta si applica alla codifica e alla decodifica dei file, in cui AVAssetReader e AVAssetWriter sono chiaramente la strada da percorrere. Tuttavia, utilizzerai l'AVFoundation per eseguire la codifica qui, come descritto da mohsenr: http://stackoverflow.com/a/3484950/19679. –