J'essaie d'envoyer une vidéo H264 / AAC du médiarecorder d'Android via une prise locale. L'objectif est de envoyer une vidéo à un serveur Wowza à travers la RTMP ou le RTSP, mais cela me donne beaucoup de problèmes et pour l'instant, j'essaie simplement d'écrire les données dans un fichier à partir du localversocket.
Voici quelques codes. Désolé, ce n'est pas vraiment propre, mais j'ai passé des heures à tester de nombreuses choses et mon projet est un gâchis en ce moment. P>
Dans l'activité de la caméra, la configuration du fichier de sortie: p>
try { mLocalServerSocket = new LocalServerSocket(mName); } catch (Exception e) { Log.e(LOG_TAG, "Error creating server socket: "+e); return; } while (true) { File out = null; FileOutputStream fop = null; try { mLocalClientSocket = mLocalServerSocket.accept(); InputStream in = mLocalClientSocket.getInputStream(); out = new File(mContext.getExternalFilesDir(null), "testfile.mp4"); fop = new FileOutputStream(out); int len = 0; byte[] buffer = new byte[1024]; while ((len = in.read(buffer)) >= 0) { Log.i(LOG_TAG, "Writing "+len+" bytes"); fop.write(buffer, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally{ try { fop.close(); mLocalClientSocket.close(); } catch (Exception e2) {} } }
3 Réponses :
OK, j'ai trouvé pourquoi les fichiers ne pouvaient pas jouer. Dans les fichiers MP4 et 3GPP, il y a un en-tête contenant les octets: p>
FTYP3GP4 3GP43GP6 Large MDAT P> blockQuote>
en hexal p>
0000001866747970336770340000030033677034336770360000000877696465000392D86D6461740000 P> blockQuote>
Les 4 octets avant que la balise 'MDAT' représente la position d'une autre balise «Moov» située à la fin du fichier. La position est généralement définie lorsque l'enregistrement est terminé, mais comme Mediarecorder ne peut pas chercher des sockets, il ne peut pas définir ces octets à la valeur correcte dans notre cas. p>
Mon problème est maintenant de trouver un moyen de faire un tel fichier en continu, car il s'agit pour qu'il soit joué avant que l'enregistrement ne soit terminé. P>
Avez-vous trouvé une solution pour le rendre régulier?
Bonjour Simon, avez-vous trouvé une certaine solution..plusez-la, je suis bloqué dans le même problème
Salut Ankita. Désolé, mais nous avons abandonné le projet pour le moment, j'ai cessé de travailler sur cette question. Bonne chance avec ça, acclamations.
Salut les gars, vérifiez ceci pour une bonne implémentation du streaming: Github.com/fyhertz/libstreaming
Vous pouvez essayer d'utiliser MP4Box pour restructurer votre fichier. La boîte Moov donne les index pour chaque échantillon audio et vidéo. Si cela est à la fin du fichier, cela rend difficile la diffusion difficile. p>
Cela pourrait aider: http://boliston.wordpress.com/tag/moovbox/ p>
ou ceci: MP4BOX -Inter 0,5 Certain_file.mp4 P>
(Je n'ai pas la chance d'essayer actuellement) p>
Si vous avez besoin de cela pour travailler avec votre application, je ne suis au courant d'aucune activité de Port MP4Box à Android. P>
BTW MP4BOX fait partie du projet GPAC de nos jours. Il y a un paquet pour cela à Ubuntu, au moins. GPAC.WP.Mines-Telecom.fr
J'ai essayé aujourd'hui de faire de même, mais MP4 n'est pas très facile à diffuser (comme dit que certaines parties sont écrites à la fin). Je ne dis pas que c'est impossible, mais cela semble au moins assez dur. P>
Une solution de contournement pour les API Android (4.3) pourrait être celle-ci: p>
L'inconvénient de cette solution est que la taille d'aperçu d'une caméra peut être inférieure à la taille de la vidéo. Cela signifie en fonction de votre appareil que vous ne pouvez enregistrer à la plus haute résolution. Astuce: Certaines caméras disent qu'ils ne prennent pas en charge les tailles de prévisualisation plus élevées, mais elles le font et vous pouvez essayer de configurer l'appareil photo pour définir la taille de l'aperçu de la taille de la vidéo. Si vous le faites, attrapez la runtimédiexception de caméra.setParameterers et s'il n'utilise que les tailles de prévisualisation prises en charge uniquement. P>
Quelques liens Comment enregistrer à partir d'une surfacetexture: p>
Bigflage: super exemples pour MediaCodeC Stuff. P>
La classe Videorecorder de la Lablet. P>
Peut aussi être utile: SpyDroid-IPCamera diffuse les données de la prise MEDIARECORDER en tant que flux RTP, mais je n'ai trouvé aucun moyen de l'alimenter au MediaCodec. (J'ai déjà été bloqué la lecture des tailles de l'unité NAL correctes telles qu'elles ...) p>
Si vous ne recevez pas d'erreur, il est probablement causé par des problèmes de codage / de fichier. Qu'est-ce que sortieFormat Avez-vous défini? Peut-être le renommer à
.3gp code> help (voir Voici
Le format de sortie est MPEG_4, donc je suppose que cela devrait être correct avec une extension .mp4. En outre, si j'écris directement à un fichier .mp4 dans mmeiarecorder.setoutputfile (), cela fonctionne parfaitement.
Avez-vous vérifié si quelque chose comme MediaInfo peut lire les propriétés de la vidéo créée? Vous pouvez également essayer un fichier de diffusion binaire (au moins de l'en-tête) d'un fichier directement généré et qu'un fichier envoie via votre prise locale pour vérifier si le fichier généré a l'air correcte.
Je n'ai pas essayé avec MediaInfo, mais personne sur mon lecteur multimédia ne peut lire le fichier ou trouver des informations de codec (essayé avec VLC, Mplayerx et QuickTime). J'ai essayé de comparer les fichiers aussi. Le travail qui travaille commence par: fttyp3gp43gp43gp6widebtmdat le non-travaille par: fttyp3gp43gp43gp6widemdat pour le reste, je travaille dessus mais pour l'instant, je ne pouvais pas dire s'il y a un problème.
Selon mattakis.com/blog/kisg/20090708/... Mon problème doit être associé à une en-tête de manière incorrecte car les sockets ne sont pas recherchées. Essayer de trouver une solution en ce moment.