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