Ушел в ЛАС
Технический директор Array
Репутация: лучше не знать
Re: USB DAC и USB Audio для Android
Накопилась очередная порция информации по RockChip , которую стоило бы уже опубликовать, чтобы случайно не потерялась.
Сообщение от
aluver Значит ли это, что SPDIF рокчипа не может 44.100 аппаратно?
RockChip S/PDIF аппаратно поддерживает до 16bit/48000 kHz, и только напрямую при воспроизведении через ALSA. Делать замеры “на лету” помогает утилита для карт Creative.
"Трассировка" сборки из RockChip 4.4.2 KK SDK привела к большой группе закрытых библиотек в SDK RockChip, являющихся еще одной прослойкой между frameworks/av/media/rkffplayer (системный аудиоплеер для RockChip Android) и подсисиемой ALSA.
Библиотеки, по сути, являются плагинами libvpu: После прочтения съесть!
device/rockchip/common/vpu/lib$ ls -la
libapedec.so libhevcdec.so libjpeghwenc.so libomxvpu_enc.so librkboxffplayer.so librk_hevcdec.so librkswscale.so libstagefrighthw.so
libffmpeg.so libjesancache.so libOMX_Core.so librk_audio.so librk_demux.so libRkOMX_Resourcemanager.so librkwmapro.so
libffmpeg_vp9dec.so libjpeghwdec.so libomxvpu_dec.so libRKBluray.so librkffplayer.so librk_on2.so libstagefright_hdcp.so
, и обеспечивают аппаратное декодирование на уровне libstagefright https://source.android.com/devices/media/index.html
В качестве примера очередного “подарка” можно привести декларацию RK_AUDIO_DEC_LIB = "librk_audio.so" из
, которая затем инициализирует декодер из “черного ящика”: Код:
sp<MediaSource> decoder = rkAudioDecoder(source, decoderType); По отладочным сообщениям сборки, на этапе декодирования тестовой записи с частотой дискретизации 48kHz происходит ошибка, после которой исходным материал “прореживается” до 44100 неведомыми алгоритмами внутри одной из закрытых библиотек, хотя до этого момента FFplayer честно пытается воспроизвести аудиоматериал без изменений: После прочтения съесть! Код:
E/FFplayer( 135): setDataSource offset =0,length = 1949074
I/FFplayer( 135): setDataSource(url =file/fd::24,offset::0)
I/FFplayer( 135): setDataSource(fileurl =/mnt/internal_sd/Music/110408__sandyrb__tubular-009.wav)
E/FFplayer( 135): ffmpeg version 1-6
E/FFplayer( 135): av_probe_input_buffer:avio_read
I/FFplayer( 135): flv_probe get probe score: 0
E/FFplayer( 135): Hery, probe size = 0
E/FFplayer( 135): avformat_open_input:read_header
E/FFplayer( 135): avformat_open_input:read_header ok
E/FFplayer( 135): Hery, s->iformat->name = wav
E/FFplayer( 135): Hery, s->duration = -9223372036854775808.000000
D/FFplayer( 135): There is not appleHls need find video Info
E/FFplayer( 135): estimate_timings:0: start_time: -9223372036854.775 duration: 0.325,base_time.den=48000,base_time.num=1
E/FFplayer( 135): stream: start_time: -9223372036854.775 duration: 6.764 bitrate=2305 kb/s
E/FFplayer( 135): audio name = pcm_s24le
D/FFplayer( 135): AudioStartTime=0,VideoStartTime=-1,tmpTime=-1
D/FFplayer( 135): setDataSource:start_time set 0
E/FFplayer( 135): FILE = /mnt/internal_sd/Music/110408__sandyrb__tubular-009.wav
D/FFplayer( 135): prepareAsync:prepare
I/FFplayer( 135): prepare in
I/FFplayer( 135): prepareVideo
E/FFplayer( 135): mVideoStreamIndex is -1
I/FFplayer( 135): prepareAudio
E/FFplayer( 135): Hery, Audio stream->codec->codec_id = 65548
D/FFplayer( 135): open MediaDecoder.cfg failed,so can't config anything
D/FFplayer( 135): File not exists!
I/FFplayer( 135): prepareSubtitle
I/FFplayer( 135): prepare ok
...
D/FFplayer( 135): initAudioPlayer
I/FFplayer( 135): ******************************************
I/FFplayer( 135):
I/RkAudioPlayer( 135): mAudioSink->open in mSampleRate = 48000 channels = 2
I/FFplayer( 135): starting main player thread:2014-1-21
I/RkAudioPlayer( 135): audio mode: 0
I/FFplayer( 135):
I/FFplayer( 135):
I/FFplayer( 135): ******************************************
I/FFplayer( 135): decodeMovie:mCurrentState = 8
I/AudioTrack( 135): set() streamType 3 frameCount 4458 flags 0000 channelMask 3 sampleRate 48000 format 1
D/FFplayer( 135): start ok
E/DecodeAudio( 135): mStream->codec->channels = 2 mStream->codec->sample_rate = 48000
I/FFplayer( 135): decodeMovie:BufferingPlayer 0x0
I/FFMpegThread( 135): starting thread
D/DecodeAudio( 135): prepare()
E/FFplayer( 135): Hery, FF_MediaPlayer::BufferingPlayer
D/FFplayer( 135): end of onBufferingThread
I/AudioHardwareALSA( 135): Audio exiting sandby will open audio device
E/DecodeAudio( 135): mConfig->nrChans = -1,mConfig->samplingRate = 0
E/AudioSink( 135): received unknown event type: 1 inside CallbackWrapper !
W/gralloc ( 132): Debugmem The fd=80, in vmalloc !!!! Ishwc=0
I/MediaFocusControl( 508): AudioFocus requestAudioFocus() from android.media.AudioManager@418ca3e0com.rockchip.mediacenter.plugins.musicplay.l@418b9ae0
I/ActivityManager( 508): Displayed com.rockchip.mediacenter/.plugins.musicplay.MusicPlayer: +279ms
D/mali_winsys( 2423): new_window_surface returns 0x3000
W/gralloc ( 132): Debugmem The fd=43, in vmalloc !!!! Ishwc=0
V/ALSAModule( 135): SAMPLERATE:44100
D/ALSAModule( 135): open called for devices 00000800 in mode 0...
D/ALSAModule( 135): DevName: AndroidPlayback_Spdif_normal
E/ALSAModule( 135): buffersize: 3072, periodsize:1024
V/ALSAModule( 135): Set PLAYBACK PCM format to S16_LE (Signed 16 bit Little Endian)
V/ALSAModule( 135): Using 2 channels for PLAYBACK.
V/ALSAModule( 135): Set PLAYBACK sample rate to 44100 HZ
E/ALSAModule( 135): audio type flag: 0
V/ALSAModule( 135): Buffer size: 3072(frames) period Size: 1024(frames) periods: 3 (buffersize=periodSize*periods)
V/ALSAModule( 135): Latency: 69659 periodTime: 23219
D/ALSAModule( 135):
D/ALSAModule( 135): DumpHandleInfo:
D/ALSAModule( 135): devices: 0xbfff
D/ALSAModule( 135): format: 0x2
D/ALSAModule( 135): channels: 2
D/ALSAModule( 135): sampleRate: 44100
D/ALSAModule( 135): latency: 69659
D/ALSAModule( 135): periodSize:1024
D/ALSAModule( 135): bufferSize:3072
Отладочные сообщения в предыдущих сборках 4.2.2 JB для RK3066 и RK3188 менее информативны, но результат “работы” системных плееров идентичен: После прочтения съесть! Код:
E/MediaPlayerFactory( 96): MediaPlayerFactory::getDefaultPlayerType
I/MediaPlayerFactory( 96): getDefaultPlayerType in
D/MediaPlayerFactory( 96): createPlayer:playerType=7
I/MediaPlayerFactory( 96): create FFPlayer
I/FFMpegMediaPlayer( 96): setDataSource(file/fd::16,offset::0)
E/FFMpegMediaPlayer( 96): ffmpeg version 2-19
E/FFMpegMediaPlayer( 96): avio_open2:open
E/FFMpegMediaPlayer( 96): avio_open2:open ok
E/FFMpegMediaPlayer( 96): av_probe_input_buffer:avio_read
I/FFMpegMediaPlayer( 96): flv_probe get probe score: 0
E/FFMpegMediaPlayer( 96): Hery, probe size = 0
E/FFMpegMediaPlayer( 96): avformat_open_input:read_header
E/FFMpegMediaPlayer( 96): avformat_open_input:read_header ok
E/FFMpegMediaPlayer( 96): Hery, s->iformat->name = wav
E/FFMpegMediaPlayer( 96): FILE = /mnt/sdcard/Music/110408__sandyrb__tubular-009.wav
I/FFMpegMediaPlayer( 96): prepareVideo
E/FFMpegMediaPlayer( 96): mVideoStreamIndex is -1
I/FFMpegMediaPlayer( 96): prepareAudio
E/FFMpegMediaPlayer( 96): Hery, Audio stream->codec->codec_id = 65548
I/FFMpegMediaPlayer( 96): prepareSubtitle
V/MusicFXControlPanelReceiver( 2140): onReceive
V/MusicFXControlPanelReceiver( 2140): Action: android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION
V/MusicFXControlPanelReceiver( 2140): Package name: com.android.music
V/MusicFXControlPanelReceiver( 2140): Audio session: 19
D/MediaPlaybackService( 2261): **********************Playing file:/mnt/sdcard/Music/110408__sandyrb__tubular-009.wav
I/AudioService( 355): AudioFocus requestAudioFocus() from android.media.AudioManager@414af290com.android.music.b@414ae320
I/AudioService( 355): Remote Control registerMediaButtonIntent() for PendingIntent{414c2720: PendingIntentRecord{413c9fd0 com.android.music broadcastIntent}}
E/FFMpegMediaPlayer( 96): start in mCurrentState in
E/FFMpegMediaPlayer( 96): start in mCurrentState = 8
I/RkAudioPlayer( 96): mAudioSink->open in mSampleRate = 48000 channels = 2
I/FFMpegMediaPlayer( 96): ******************************************
I/FFMpegMediaPlayer( 96):
I/FFMpegMediaPlayer( 96): starting main player thread:2013-2-24
I/FFMpegMediaPlayer( 96):
I/FFMpegMediaPlayer( 96):
I/FFMpegMediaPlayer( 96): ******************************************
I/FFMpegMediaPlayer( 96): mCurrentState = 8
E/FFMpegMediaPlayer( 96): Hery, FF_MediaPlayer::BufferingPlayer
D/FFMpegMediaPlayer( 96): end of onBufferingThread
I/ ( 96): starting thread
D/AUDIO_DECOE( 96): prepare()
D/MediaPlaybackActivity( 2261): initListView
D/MediaPlaybackActivity( 2261): mAdapter null
D/MediaPlaybackActivity( 2261): getColumIndices
D/MediaPlaybackActivity( 2261): getTrackCursor
E/MediaPlayerFactory( 96): MediaPlayerFactory::getDefaultPlayerType
I/MediaPlayerFactory( 96): getDefaultPlayerType in
D/MetadataRetrieverClient( 96): start FFPLAYER
I/RKMetadataRetriever( 96): setDataSource(35, 0, 1949074)
D/RKMetadataRetriever( 96): setDataSource:filePath=/mnt/sdcard/Music/110408__sandyrb__tubular-009.wav
E/FFMpegMediaPlayer( 96): ffmpeg version 2-19
E/FFMpegMediaPlayer( 96): avio_open2:open
E/FFMpegMediaPlayer( 96): avio_open2:open ok
E/FFMpegMediaPlayer( 96): av_probe_input_buffer:avio_read
I/FFMpegMediaPlayer( 96): flv_probe get probe score: 0
E/FFMpegMediaPlayer( 96): Hery, probe size = 0
E/FFMpegMediaPlayer( 96): avformat_open_input:read_header
E/FFMpegMediaPlayer( 96): avformat_open_input:read_header ok
E/MediaPlayerFactory( 96): MediaPlayerFactory::getDefaultPlayerType
I/MediaPlayerFactory( 96): getDefaultPlayerType in
D/MetadataRetrieverClient( 96): start FFPLAYER
I/RKMetadataRetriever( 96): setDataSource(35, 0, 1949074)
D/RKMetadataRetriever( 96): setDataSource:filePath=/mnt/sdcard/Music/110408__sandyrb__tubular-009.wav
E/FFMpegMediaPlayer( 96): ffmpeg version 2-19
E/FFMpegMediaPlayer( 96): avio_open2:open
E/FFMpegMediaPlayer( 96): avio_open2:open ok
E/FFMpegMediaPlayer( 96): av_probe_input_buffer:avio_read
I/FFMpegMediaPlayer( 96): flv_probe get probe score: 0
E/FFMpegMediaPlayer( 96): Hery, probe size = 0
E/FFMpegMediaPlayer( 96): avformat_open_input:read_header
E/FFMpegMediaPlayer( 96): avformat_open_input:read_header ok
Чтобы не пытаться переписать libStageFright с обходчиком RK-декодера, можно поискать полный исходный код библиотек.
Структура WAVDecoder’а известна по заголовочному файлу:
Пути в полном SDK (который имеется у разработчиков), и некоторую информацию о расположении недостающих файлах с исходным кодом, можно почерпнуть из бинарного файла библиотеки: После прочтения съесть!
frameworks/av/media/libstagefright/rkaudiodecoder/wavdec/WAVDecoder.cpp:106 CHECK(!mStarted) failed.
frameworks/av/media/libstagefright/rkaudiodecoder/wavdec/WAVDecoder.cpp:53 CHECK(srcFormat->findInt32(kKeyChannelCount, &mNumChannels)) failed.
frameworks/av/media/libstagefright/rkaudiodecoder/wmadec/WMADecoder.cpp
frameworks/av/media/libstagefright/rkaudiodecoder/wmapro/WMAPRODecoder.cpp
Некоторые куски дикого кода из этой же серии
, и, в частности, можно предположить заимствование частей кода из декодеров для других платформ (чтобы, по крайней мере, понять логику преобразований):
Пока без выводов, но довольно неожиданно, поскольку казалось что платформа уже была достаточно глубоко изучена в плане звуковоспроизведения под Андроид. Даже если на этом этапе есть неудобства или выявляются баги, то рано или поздно коды и этих библиотек будут доведены до ума, и аппаратные возможности обработки могут сыграть даже большую роль, чем развитие звуковых возможностей Linux/Android .
Социальные закладки