代码之家  ›  专栏  ›  技术社区  ›  Eugene

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

  •  0
  • Eugene  · 技术社区  · 8 年前

    我需要使用 MediaCodec
    Response Headers 这条河的尽头是 MIME / Content Type
    MediaCodec 应在调用之前配置 MediaCodec::start() . MediaFormat MediaCodec
    或者我该怎么办?

    "Too broad" 什么都没说。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Mick    8 年前

    这些容器将包括描述容器内各个流的标头信息,包括用其编码的编解码器。

    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;