是否可以让MediaCodec根据流数据进行自我配置?

时间:2017-07-23 13:39:43

标签: android streaming audio-streaming mediacodec android-mediacodec

我需要使用MediaCodec来解码在线流媒体音频(例如Shoutcast) 问题是我没有关于Stream格式的信息。我可以从流Response Headers获得的唯一内容是MIME / Content Type。 应在调用MediaCodec之前配置MediaCodec::start()。应以某种方式填写MediaFormat个对象。但是可以让MediaCodec从流数据中配置自己吗?
或者我该怎么办?
人们,如果您认为问题太广泛,请发表评论,让我知道究竟应该改变什么。只需将其标记"Too broad"就不会对此有所了解。

1 个答案:

答案 0 :(得分:1)

流媒体,音频或视频通常在“容器”中流式传输。像mp4,avi,mp3等。

这些容器将包含标题信息,用于描述容器中的各个流,包括它们编码的编解码器。

如果您熟悉ffmpeg,可以使用相关的探测工具ffprobe来查看mp4并查看流。视频文件的示例输出是:

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

您可以在各自的流中看到音频和视频编解码器。

在Android上播放音频或视频流的最简单方法是使用MediaPlayer,因为它会负责查看容器并选择正确的编解码器等:https://developer.android.com/reference/android/media/MediaPlayer.html

我猜这不能满足您的需求,所以您很可能想要使用MediaExtractor然后使用MediaCodec。

MediaExtractor'提取'来自容器的轨道,所以你可以做任何你想做的事情。在撰写本文时,文档页面上有一个很好的例子(https://developer.android.com/reference/android/media/MediaExtractor.html),转载于此处:

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;