0

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

1

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; 
+0

Oui! 'MediaExtractor' est ce que je cherche! Merci! – Eugene