Comment utiliser le décodage vidéo accéléré / H.264 avec DirectX 11 et Windows 7?
J'ai fait des recherches toute la journée et pas eu de très loin. Je suis sur windows 7, l'utilisation de directx 11. (Ma dernière sortie est une image de la vidéo sur un DX11 texture)
Je veux décoder certains très gros fichiers vidéo H. 264, et le CPU (à l'aide de libav) ne coupe pas.
J'ai regardé le hwaccel capacités de libav à l'aide de DXVA2, mais a frappé un bloc de route quand j'ai besoin de créer un IDirectXVideoDecoder, qui ne peut être créé avec un D3D9 interface. (je n'en ai pas à l'aide de DX11)
Chaque fois que j'ai regardé DXVA de la documentation, il ne fait pas référence DX11, qui a supprimé en DX10 ou 11? (Ne peut pas trouver une confirmation de cela, ni nulle part qui dit DXVA2 est redondant, probablement que c'est bientôt remplacer par DXVA-HD?)
Puis j'ai regardé dans les médias de la fondation kit SDK qui ressemble à ce que je suis censé utiliser pour DX11... Mais aucun des types existent pas dans mes en-têtes (Les docs disent simplement d'inclure , mais cela donne rien). Ils ont également spécifier un minimum de windows 8 pour l'utiliser.
Je crois à utiliser MF j'ai besoin de la windows 8 SDK, qui inclut désormais tous les directx libs/en-têtes.
Ceci laisse donc un écart avec windows 7... Est-il possible d'obtenir l'accélération matérielle du décodage vidéo? et si oui, quelle API suis-je censé utiliser?
source d'informationauteur Soylent Graham
Vous devez vous connecter pour publier un commentaire.
D3D11 propose une vidéo de l'api qui est essentiellement DXVA2 avec une légère altération de l'interface ci-dessus.
Vous avez besoin d'une bonne compréhension de h.264 flux de bits (vraiment!). d. assurez-vous d'avoir une h de la.264 analyseur à la main pour en extraire les champs de la SPS et PPS les structures et tous les morceaux de l'image codée.
1) Obtenir ID3D11VideoDevice instance de votre ID3D11Device, et ID3D11VideoContext immédiats D3D11 contexte de périphérique
REMARQUE: Sur Win7, vous devez créer votre appareil avec le niveau de fonctionnalité 9_3 pour obtenir le support de la vidéo! (Dans Win8 il fonctionne, tout simplement)
2) Créer un ID3D11VideoDecoder exemple pour h.264
Utilisation ID3D11VideoDevice::GetVideoDecoderProfileCount, GetVideoDecoderProfile, CheckVideoDecodeRFormat...
pour itérer sur tous les profils pris en charge, et en trouver un avec GUID D3D11_DECODER_PROFILE_H264_VLD_NOFGT
pour h264 sans filmgrain. Comme OutputFormat votre meilleur pari est DXGI_FORMAT_NV12.
3) de Décodage des images pour voir L'appui de Direct3D 11 Décodage Vidéo dans les Médias de la Fondation:
Les tampons sont remplis avec le correspondant DXVA2 structures (voir dxva2.h)
La pleine DXVA2 spec est ici, vous aurez besoin de la carte de l'h.264 sps/pps champs en conséquence.
Voir:
Alors:
3) D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS tampon contient également des infos sur toutes les références d'images/surface
- vous devez gérer vous-même, c'est à dire assurez-vous que les surfaces et les textures sont disponibles pour le GPU!
C'est assez compliqué, vérifiez ffmpeg et Media Player Classic, ils ont tous deux DXVA2 (mais pas via DX11).
4) Convertir NV12 RVB(A), certains Gpu (D3D11 fonction des niveaux) permettent l'utilisation d'NV12 comme entrée d'un shader, certains ne le font pas. Dans le cas où il n'est pas possible d'utiliser NV12 directement, jetez un oeil à la D3D11VideoProcessor interfaces qui disposent d'NV12/YUV420->conversion RGB pour tous les Gpu avec D3D11 soutien.
La conversion peut être effectuée dans un code comme ceci:
En suivi, je suis actuellement en utilisant MediaFoundation avec windows 7, 8 et 10, avec directx(ou juste le SDK de Windows dans le cas de 8+)
Il supporte beaucoup moins de formats (ou plutôt, les résolutions/niveaux de profil), et actuellement je ne suis pas sûr si c'est à l'aide de l'accélération matérielle ou pas...
Mais cette API est compatible, ce qui était à l'origine de la requête