Décoder le flux de H264 brut dans android?
j'ai un projet où on m'a demandé d'afficher un flux vidéo sur android, le flux est raw H. 264 et je me connecte à un serveur et je recevrai un flux octet du serveur.
en gros, je me demande s'il y a un moyen d'envoyer des octets bruts à un décodeur sous android et de l'afficher sur une surface?
j'ai réussi à décoder H264 enveloppé dans un conteneur mp4 en utilisant la nouvelle API MediaCodec et MediaExtractor dans android 4.1, malheureusement, je n'ai pas trouvé le moyen de décoder un fichier H264 brut ou un flux utilisant ces API.
je comprends que c'est une façon de compiler et d'utiliser FFmpeg, mais je préfère utiliser une méthode intégrée qui peut utiliser l'accélération MATÉRIELLE. Je comprends également que le streaming RTSP est pris en charge sur android, mais ce n'est pas une option. La version Android n'est pas un problème.
3 réponses
Je ne peux pas fournir de code pour cela malheureusement, mais je vais faire de mon mieux pour l'expliquer basée sur la façon dont je l'ai obtenu pour travailler.
donc voici mon aperçu de la façon dont j'ai obtenu la vidéo codée brute H. 264 pour travailler en utilisant la classe MediaCodec ( http://developer.android.com/reference/android/media/MediaCodec.html ).
en utilisant le lien ci-dessus il y a un exemple d'obtenir la configuration du décodeur et comment l'utiliser, vous aurez besoin de le configurer pour décodage H264 AVC.
le format de H. 264 est qu'il est composé d'unités NAL, chacune commençant par un préfixe de départ de trois octets avec les valeurs 0x00, 0x00, 0x01 et chaque unité a un type différent en fonction de la valeur du 4ème octet juste après ces 3 octets de départ. Une unité NAL N'est pas une image dans la vidéo, chaque image est composée d'un certain nombre d'unités NAL.
fondamentalement, j'ai écrit une méthode qui trouve chaque unité individuelle et le passe au décodeur (une unité nale étant le préfixe de départ et les octets qui s'y trouvent ensuite jusqu'au prochain préfixe de départ).
maintenant si vous avez la configuration du décodeur pour décoder H. 264 AVC et avoir un InputBuffer du décodeur alors vous êtes prêt à aller. Vous devez remplir ce InputBuffer avec une unité NAL et le passer de nouveau au décodeur et continuer à le faire pour la longueur du flux. Mais, pour faire ce travail j'ai dû passer le décodeur un SPS (Sequence Parameter Set) NALE de l'Unité première. Cette unité a une valeur de byte de 0x67 après le préfixe de départ (le 4ème byte), sur certains appareils le décodeur se planterait à moins qu'il n'ait reçu cette unité en premier. En gros, jusqu'à ce que vous trouviez cette unité, ignorez toutes les autres unités NAL et continuez à analyser le flux jusqu'à ce que vous obteniez cette unité, alors vous pouvez passer toutes les autres unités au décodeur.
certains appareils n'avaient pas besoin du SPS en premier et d'autres l'ont fait, mais il vaut mieux le passer en premier.
maintenant si vous avait une surface que vous avez passé au décodeur lorsque vous l'avez configuré, puis une fois qu'il reçoit suffisamment d'unités NAL pour un cadre, il doit l'afficher sur la surface.
vous pouvez télécharger le H. 264 brut à partir du serveur, puis l'offrir via un serveur HTTP local fonctionnant sur le téléphone et ensuite laisser VLC pour Android faire la lecture à partir de ce serveur HTTP. Vous devez utiliser le schéma http/h264:// de VLC pour forcer le démuxer à utiliser le mode brut H. 264 (si vous ne forcez pas le demuxer VLC peut ne pas être en mesure de reconnaître le flux, même si le type MIME retourné par le serveur HTTP est correctement défini). Voir
pour un exemple sur la façon de créer une intention qui lancera VLC.
Note: raw H. 264 n'a apparemment pas d'informations de synchronisation, donc VLC va jouer aussi vite que possible. D'abord l'intégrer dans MPEGTS sera mieux. Je n'ai pas encore trouvé de lib androïde qui ferait ça.
Voici les ressources que j'ai trouvées utiles dans un projet similaire:
- cette vidéo a été très perspicace dans la compréhension de la façon dont MediaCodec gère l'h brut.Flux 264 à un niveau élevé.
- ce fil est un peu plus détaillé quant à la manipulation du NALUs SPS/PPS en particulier. Comme mentionné ci-dessus, vous avez besoin de séparer les unités NAL individuelles en utilisant le préfixe de départ, et puis remettez les données restantes au MediaCodec.
- Ce repo (libstreaming) est un excellent exemple de décodage d'un flux H264 en Android à l'aide de RTSP/RTP pour la transmission.