Je dois utiliser MediaCodec
pour décoder l'audio en continu en ligne (par exemple Shoutcast).
Et le problème est que je n'ai aucune information sur le format du flux. La seule chose que je peux obtenir à partir du Response Headers
du Stream est le MIME
/Content Type
.
MediaCodec
doit être configuré avant l'appel de MediaCodec::start()
. MediaFormat
objet devrait être rempli d'une manière ou d'une autre. Mais est-il possible de faire MediaCodec
pour se configurer à partir des données de flux?
Ou que devrais-je faire? Les gens, si vous pensez que la question est trop large, s'il vous plaît, faites un commentaire et laissez-moi savoir ce que je devrais changer exactement. Juste le marquer "Too broad"
ne dit rien à ce sujet.Est-il possible de faire MediaCodec pour se configurer à partir des données de flux?
Répondre
médias streamées, audio ou vidéo, est généralement ruisselaient dans un « conteneur » comme mp4, avi, mp3, etc.
Ces conteneurs comprendront des informations d'en-tête qui décrit les flux individuels à l'intérieur du conteneur, y compris les codecs ils sont encodés avec.
Si vous connaissez ffmpeg, vous pouvez utiliser l'outil de sondage associé, ffprobe, pour examiner un mp4 et afficher les flux. Un exemple de sortie pour un fichier vidéo est:
ffprobe version 3.3.1 Copyright (c) 2007-2017 the FFmpeg developers
built with llvm-gcc 4.2.1 (LLVM build 2336.11.00)
configuration: --prefix=/Volumes/Ramdisk/sw --enable-gpl --enable-pthreads --enable-version3 --enable-libspeex --enable-libvpx --disable-decoder=libvpx --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-avfilter --enable-libopencore_amrwb --enable-libopencore_amrnb --enable-filters --enable-libgsm --enable-libvidstab --enable-libx265 --disable-doc --arch=x86_64 --enable-runtime-cpudetect
libavutil 55. 58.100/55. 58.100
libavcodec 57. 89.100/57. 89.100
libavformat 57. 71.100/57. 71.100
libavdevice 57. 6.100/57. 6.100
libavfilter 6. 82.100/6. 82.100
libswscale 4. 6.100/4. 6.100
libswresample 2. 7.100/2. 7.100
libpostproc 54. 5.100/54. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'BigBuckBunny_320x180.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: mp41
creation_time : 1970-01-01T00:00:00.000000Z
title : Big Buck Bunny
artist : Blender Foundation
composer : Blender Foundation
date : 2008
encoder : Lavf52.14.0
Duration: 00:09:56.46, start: 0.000000, bitrate: 867 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p, 320x180 [SAR 1:1 DAR 16:9], 702 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc (default)
Metadata:
creation_time : 1970-01-01T00:00:00.000000Z
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a/0x6134706D), 48000 Hz, stereo, fltp, 159 kb/s (default)
Metadata:
creation_time : 1970-01-01T00:00:00.000000Z
handler_name : SoundHandler
Vous pouvez voir les codecs audio et vidéo dans leurs flux respectifs.
La meilleure façon de lire un flux audio ou vidéo sur Android est d'utiliser MediaPlayer comme il prendra soin de regarder le récipient et sélectionner le bon codec etc: https://developer.android.com/reference/android/media/MediaPlayer.html
Je suppose que cela ne répond pas vos besoins pour une raison quelconque, donc vous voudrez probablement utiliser MediaExtractor, puis MediaCodec. MediaExtractor 'extrait' la piste du conteneur afin que vous puissiez faire ce que vous voulez faire avec. Il y a un bon exemple sur la page de documentation au moment de l'écriture (https://developer.android.com/reference/android/media/MediaExtractor.html), reproduit ici:
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(...);
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; ++i) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (weAreInterestedInThisTrack) {
extractor.selectTrack(i);
}
}
ByteBuffer inputBuffer = ByteBuffer.allocate(...)
while (extractor.readSampleData(inputBuffer, ...) >= 0) {
int trackIndex = extractor.getSampleTrackIndex();
long presentationTimeUs = extractor.getSampleTime();
...
extractor.advance();
}
extractor.release();
extractor = null;
Oui! 'MediaExtractor' est ce que je cherche! Merci! – Eugene