成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android平臺上音頻錄制與播放的關鍵類及其功能,助你選擇合適方式進行音頻處理任務

移動開發 Android
MediaPlayer主要用于后臺長時間播放本地音樂文件或在線流媒體文件。提供了一個高層次的封裝,使播放音頻變得相對簡單。MediaPlayer特別適合那些需要連續播放較長時間音頻的應用場景,例如音樂播放器或視頻播放器。

安卓平臺和聲音錄制與播放相關的主要是4個類:MediaRecorder,MediaPlayer,SoundPool,AudioRecord和AudioTrack。

  1. 「MediaRecorder」 可以錄制視頻和音頻到文件
  2. 「MediaPlayer」 可以播放視頻和音頻文件
  3. 「SoundPool」 用于播放比較短的音頻片段
  4. 「AudioRecord」 可以提供接口讀取音頻流數據(byte數組或者short數組)
  5. 「AudioTrack」 提供接口用于播放音頻流數據。

其中MediaRecorder和AudioRecord用于聲音錄制,SoundPool、MediaPlayer和AudioTrack用于聲音播放。AudioRecord和AudioTrack用于操作音頻流數據,操作對象是byte數組(或者short數組),而MediaRecorder和MediaPlayer提供了經過更高層抽象和封裝接口,直接對文件進行操作,而且它倆功能更豐富,同時支持音頻和視頻。

MediaRecorder

MediaRecorder是Android提供的一個用于音視頻錄制的高級類。封裝了底層的音視頻編碼器(通常是MediaCodec)和其他相關組件。如果不需要對音視頻進行更底層的控制,只是想要方便地進行錄制操作,那么可以選擇使用MediaRecorder。

圖片圖片

MediaRecorder提供了一系列的方法用于配置和控制錄制過程,例如設置音頻和視頻源、設置輸出格式和編碼、開始和停止錄制等。還提供了錯誤監聽器和信息監聽器,以便在錄制過程中處理錯誤事件和獲取錄制信息。

在配置MediaRecorder時,需要先創建一個MediaRecorder實例,設置音頻和視頻源,以及輸出文件的格式和編碼。例如,可以使用setAudioSource()方法設置音頻來源,使用setVideoSource()方法設置視頻來源,使用setOutputFormat()和setVideoEncoder()等方法設置輸出格式和視頻編碼。

完成配置后,調用MediaRecorder的prepare()方法準備錄制,調用start()方法開始錄制。當錄制完成后調用stop()方法停止錄制,最后調用release()方法釋放錄制資源。

MediaRecorder主要方法:

setAudioChannels(int numChannels) //設置錄制的音頻通道數
setAudioEncoder(int audio_encoder) //設置audio的編碼格式
setAudioEncodingBitRate(int bitRate) //設置錄制的音頻編碼比特率
setAudioSamplingRate(int samplingRate) //設置錄制的音頻采樣率
setAudioSource(int audio_source) //設置用于錄制的音源
setAuxiliaryOutputFile(String path) //輔助時間的推移視頻文件的路徑傳遞
setAuxiliaryOutputFile(FileDescriptor fd)//在文件描述符傳遞的輔助時間的推移視頻
setCamera(Camera c) //設置一個recording的攝像頭
setCaptureRate(double fps) //設置視頻幀的捕獲率
setMaxDuration(int max_duration_ms) //設置記錄會話的最大持續時間(毫秒)
setMaxFileSize(long max_filesize_bytes) //設置記錄會話的最大大小(以字節為單位)
setOutputFile(FileDescriptor fd) //傳遞要寫入的文件的文件描述符
setOutputFile(String path) //設置輸出文件的路徑
setOutputFormat(int output_format) //設置在錄制過程中產生的輸出文件的格式
setPreviewDisplay(Surface sv) //表面設置顯示記錄媒體(視頻)的預覽
setVideoEncoder(int video_encoder) //設置視頻編碼器,用于錄制
setVideoEncodingBitRate(int bitRate) //設置錄制的視頻編碼比特率
setVideoFrameRate(int rate) //設置要捕獲的視頻幀速率
setVideoSize(int width, int height) //設置要捕獲的視頻的寬度和高度
setVideoSource(int video_source) //開始捕捉和編碼數據到setOutputFile(指定的文件)
setLocation(float latitude, float longitude) //設置并存儲在輸出文件中的地理數據(經度和緯度)
setProfile(CamcorderProfile profile) //指定CamcorderProfile對象
setOrientationHint(int degrees) //設置輸出的視頻播放的方向提示
setOnErrorListener(MediaRecorder.OnErrorListener l) //注冊一個用于記錄錄制時出現的錯誤的監聽器
setOnInfoListener(MediaRecorder.OnInfoListener listener) //注冊一個用于記錄錄制時出現的信息事件
getMaxAmplitude() //獲取在前一次調用此方法之后錄音中出現的最大振幅
prepare() //準備錄制。
release() //釋放資源
reset() //將MediaRecorder設為空閑狀態
start() //開始錄制
stop() //停止錄制

MediaRecorder主要配置參數:

  1. 「視頻編碼格式」MediaRecorder.VideoEncoder
default,H263,H264,MPEG_4_SP,VP8
  1. 「音頻編碼格式」MediaRecorder.AudioEncoder
default,AAC,HE_AAC,AAC_ELD,AMR_NB,AMR_WB,VORBIS
  1. 「視頻資源獲取方式」MediaRecorder.VideoSource
default,CAMERA,SURFACE
  1. 「音頻資源獲取方式」MediaRecorder.AudioSource
defalut,camcorder,mic,voice_call,voice_communication,voice_downlink,voice_recognition, voice_uplink
  1. 「資源輸出格式」MediaRecorder.OutputFormat
amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp,aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm

MediaPlayer

MediaPlayer是Android平臺上的一個多媒體框架,支持播放各種常見的媒體類型,如音頻、視頻和圖片,能夠輕松地將這些媒體內容集成到應用中。

圖片圖片

MediaPlayer提供了豐富的API和功能能夠靈活地控制媒體的播放。通過MediaPlayer的API可以播放存儲在應用資源中的媒體文件、文件系統中的獨立文件,或者通過網絡連接接收到的數據流中的音頻或視頻。

在使用MediaPlayer時,需要創建一個MediaPlayer實例,通過調用setDataSource()方法來指定要播放的媒體文件或流的來源。調用prepare()或prepareAsync()方法使MediaPlayer對象進入Prepared狀態,準備播放媒體內容。在媒體準備好之后調用start()方法來開始播放。

MediaPlayer還提供了各種控制選項,如暫停、恢復、停止播放,以及調整音量和播放速度等。可以使用MediaPlayer來監聽媒體播放過程中的事件,如播放完成、播放錯誤等,以便進行相應的處理。

MediaPlayer主要方法:

  1. 「實例化方式」
MediaPlayer mp = new MediaPlayer();
//或
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
  1. 「設置播放源」
setDataSource(String path)//指定裝載path路徑所代表的文件。
setDataSource(Context context, Uri uri, Map<String, String headers)//指定裝載uri所代表的文件。
setDataSource(Context context, Uri uri)//指定裝載uri所代表的文件。
setDataSource(FileDescriptor fd, long offset, long length)//指定裝載fd所代表的文件中從offset開始長度為length的文件內容。
setDataSource(FileDescriptor fd)//指定裝載fd所代表的文件。
  1. 「配置播放參數」
setAudioStreamType(int streamtype)//設置音頻流的類型。
setDisplay(SurfaceHolder sh)//設置顯示方式。
setLooping(boolean looping)//設置是否循環播放。
setNextMediaPlayer(MediaPlayer next)//設置當前流媒體播放完畢,下一個播放的MediaPlayer。
setScreenOnWhilePlaying(boolean screenOn)//設置是否使用SurfaceHolder來顯示。
setSurface(Surface surface)//設置Surface。
setVideoScalingMode(int mode)//設置視頻縮放的模式。
setVolume(float leftVolume, float rightVolume)//設置播放器的音量。
setWakeMode(Context context, int mode)//為MediaPlayer設置低級電源管理行為。
  1. 「播放控制函數」
start()//開始或恢復播放。
stop()//停止播放。
pause()//暫停播放。
prepare()//準備播放(裝載音頻),調用此方法會使MediaPlayer進入Prepared狀態。
prepareAsync()//準備播放異步音頻。
release()//釋放媒體資源
reset()//重置MediaPlayer進入未初始化狀態。
seekTo(int msec)//指定的時間位置。
  1. 「監聽事件函數」
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)//注冊一個回調函數,在網絡視頻流緩沖變化時調用。
setOnCompletionListener(MediaPlayer.OnCompletionListener listener)//為Media Player的播放完成事件綁定事件監聽器。
setOnErrorListener(MediaPlayer.OnErrorListener listener)//為MediaPlayer的播放錯誤事件綁定事件監聽器。
setOnPreparedListener(MediaPlayer.OnPreparedListener listener)//當MediaPlayer調用prepare()方法時觸發該監聽器。
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)//當MediaPlayer調用seek()方法時觸發該監聽器。
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)//注冊一個用于監聽視頻大小改變的監聽器。
  1. 「獲取參數函數」
getCurrentPosition()//獲取當前播放的位置。
getDuration()//獲取音頻的時長。
getVideoHeight()//獲取視頻的高度。
getVideoWidth()//獲取視頻的寬度。
isLooping()//判斷MediaPlayer是否正在循環播放。
isPlaying()//判斷MediaPlayer是否正在播放。

SoundPool

SoundPool是Android提供的一個音頻播放工具類,主要用于播放較短的音頻文件,例如音效、提示音等。

SoundPool特點:

  1. 「低延遲」:SoundPool使用較低的延遲來播放音頻,特別適合實時性要求較高的場景。
  2. 「資源管理」:SoundPool能夠管理多個音頻資源,并且可以預加載音頻文件,從而提高播放的響應速度。
  3. 「多次播放」:SoundPool支持多次播放同一個音頻文件,能夠實現連續播放、循環播放等效果。
  4. 「多聲道支持」:SoundPool支持多聲道播放,可以同時播放多個音頻文件。

使用SoundPool的基本流程:創建一個SoundPool對象->載入要播放的音頻->播放某個音頻->在需要時停止播放某個音頻。每個載入的音頻在SoundPool中都會對應一個SoundID,播放時通過SoundID來指定要播放的音頻。

SoundPool的應用場景廣泛,包括游戲開發、多媒體應用、音頻提示等。在游戲開發中,可以使用SoundPool來播放游戲音效、背景音樂等;在多媒體應用中,可以使用SoundPool來播放短音頻片段,如按鈕點擊音效、提示音等;在音頻提示方面,可以使用SoundPool來實現鬧鐘、提醒等功能。

SoundPool加載的音頻資源是加載進內存,所以要求盡可能的短。每個音頻資源的大小被限制在1M左右(相當于時長5.6s、采樣率在44.1kHz的雙聲道音頻資源)。如果超過這個限制大小,音頻會被裁剪。

SoundPool主要方法:

  1. 「實例化方式」
//參數:
//maxStreams:指定支持多少個聲音,SoundPool對象中允許同時存在的最大流的數量,該值太大就會報錯AudioFlinger could not create track, status: -12 ,就聽不到聲音
//streamType:指定聲音類型,流類型可以分為STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和STREAM_ALARM四種類型。在AudioManager中定義。
//srcQuality:指定聲音品質(采樣率變換質量),一般直接設置為0

SoundPool(int maxStreams, int streamType, int srcQuality)

在低版本中使用上述構造方法,API 21(Android 5.0)后這個構造方法過時了,使用SoundPool.Builder實例化SoundPool:

SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(10);
spb.setAudioAttributes(null);    //轉換音頻格式
SoundPool sp = spb.build();      //創建SoundPool對象
  1. 「加載音頻資源文件」
load(Context context, int resId, int priority) //從res資源載入
load(String path, int priority) //文件路徑,文件的絕對路線,如存放在sd卡中的音頻 priority:沒什么用的一個參數,建議設置為1,保持和未來的兼容性
load(FileDescriptor fd, long offset, long length, int priority) //文件描述符
load(AssetFileDescriptor afd, int priority) //從asset目錄讀取某個資源文件,context.getAssets().openFd("xxx"),xxx表示文件名

上述方法都會返回一個Integer類型的音頻ID,后續使用該ID進行播放。

  1. 「播放音頻文件」
//soundID:Load()返回的聲音ID號,以上可以通過map.get(1)獲取
//leftVolume:左聲道音量設置  一般為0-1,默認填1
//rightVolume:右聲道音量設置 一般為0-1,默認填1
//priority:指定播放聲音的優先級,數值越高,優先級越大。默認填0
//loop:指定是否循環:-1表示無限循環,0表示不循環,其他值表示要重復播放的次數
//rate:指定播放速率:1.0的播放率可以使聲音按照其原始頻率,而2.0的播放速率,可以使聲音按照其 原始頻率的兩倍播放。如果為0.5的播放率,則播放速率是原始頻率的一半。播放速率的取值范圍是0.5至2.0。

play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate); //其返回值為一個int類型的數字

如果SoundPool剛調用加載load方法之后,直接調用SoundPool的play方法可能出現error "sample 1 not READY",建議調用加載資源函數load之后,實現資源加載結束的監聽函數,在監聽到資源加載結束之后,再進行播放音頻文件。

soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
        soundPool.play(1, 1, 1, 0, 0, 1);
    }
});
  1. 卸載音頻或者停止播放重置資源
//streamID:通過play()返回
soundPool.pause(int streamID)  //暫停指定播放流的音效

//streamID:通過play()返回
soundPool.resume(int streamID)  //繼續播放指定播放流的音效

//streamID:通過play()返回
soundPool.stop(int streamID) //終止指定播放流的音效

//soundID:load()返回的音頻ID
soundPool.unload(int soundID) //卸載一個指定的音頻資源.

soundPool.release() //釋放SoundPool中的所有音頻資源.

AudioRecord

AudioRecord為Android應用提供了一個強大而靈活的音頻錄制工具。AudioRecord都能提供高質量的音頻數據,可用于語音識別、電話錄音和其他音頻處理任務。

  1. 「音頻源」:AudioRecord支持從多種音頻源中錄制音頻數據,例如麥克風、電話線路、語音識別等。
  2. 「音頻格式」:AudioRecord允許選擇不同的音頻格式來錄制音頻數據,如PCM(脈沖編碼調制)、AAC(高級音頻編碼)等。這些格式的選擇可以根據應用場景和編碼需求進行。
  3. 「緩沖區」:AudioRecord使用一個緩沖區來存儲錄制的音頻數據。可以指定緩沖區的大小,以適應不同的錄制需求。
  4. 「配置參數」:通過AudioRecord的API接口可以設置錄制設備的參數,包括采樣率、聲道數、音頻格式等。
  5. 「工作流程」:使用AudioRecord進行音頻錄制的工作流程包括配置參數、初始化內部音頻緩沖區、開始采集音頻數據、通過線程不斷從緩沖區讀取數據,并在需要時停止采集和釋放資源。
  6. 「性能與特點」:由于AudioRecord直接與Android的音頻硬件交互,在性能上具有顯著優勢。AudioRecord還具備線程安全、低延遲錄制、多格式支持、實時處理、可擴展性強等特點,使得它在各種音頻錄制場景中都能表現出色。

AudioRecord的工作流程:

(1) 配置參數,初始化內部的音頻緩沖區
(2) 開始采集
(3) 需要一個線程,不斷地從 AudioRecord 的緩沖區將音頻數據“讀”出來,注意,這個過程一定要及時,否則就會出現“overrun”的錯誤,該錯誤在音頻開發中比較常見,意味著應用層沒有及時地“取走”音頻數據,導致內部的音頻緩沖區溢出。
(4) 停止采集,釋放資源

AudioRecord的參數配置:

  • 「audioSource」 參數指的是音頻采集的輸入源,可選的值以常量的形式定義在 MediaRecorder.AudioSource 類中,常用的值包括:DEFAULT(默認),VOICE_RECOGNITION(用于語音識別,等同于DEFAULT),MIC(由手機麥克風輸入),VOICE_COMMUNICATION(用于VoIP應用)等等。
  • 「sampleRateInHz」 采樣率,注意,目前44100Hz是唯一可以保證兼容所有Android手機的采樣率。
  • 「channelConfig」 通道數的配置,可選的值以常量的形式定義在 AudioFormat 類中,常用的是 CHANNEL_IN_MONO(單通道),CHANNEL_IN_STEREO(雙通道)。
  • 「audioFormat」 這個參數是用來配置“數據位寬”的,可選的值也是以常量的形式定義在 AudioFormat 類中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保證兼容所有Android手機的。

AudioTrack

AudioTrack是Android平臺下用于管理和播放單一音頻資源的類,特別適合低延遲的播放和流媒體的播放,提供了強大的控制能力。

  1. 「音頻播放」:AudioTrack主要用于播放已經解碼的PCM流。通過配置AudioTrack實例,調用其play方法,將AudioTrack切換到播放狀態,并啟動播放線程循環向AudioTrack的緩沖區寫入數據,可以實現音頻的播放。
  2. 「數據加載模式」:AudioTrack提供了兩種數據加載模式:MODE_STREAM和MODE_STATIC。MODE_STREAM模式下,音頻數據通過write操作一次次寫入AudioTrack中,在一定程度上會引入延時。而MODE_STATIC模式下,所有數據在play之前一次性寫入AudioTrack的內部緩沖區,后續無需再傳遞數據,需注意一次性寫入的數據量不能過多,以免系統無法分配足夠內存。
  3. 「音頻流類型」:在配置AudioTrack時,需要指定音頻流類型,如系統聲音的音頻流、音樂播放的音頻流、用于通話的音頻流、用于通知的音頻流等。有助于系統正確管理音頻資源。
  4. 「實時處理」:AudioTrack可用于播放本地保存的音頻文件,還適用于實時音頻處理和播放。例如,可以實現音頻錄制和回放功能,將采集到的音頻數據寫入AudioTrack對象并播放出來。

AudioTrack的工作流程:

(1) 配置參數,初始化內部的音頻播放緩沖區
(2) 開始播放
(3) 需要一個線程,不斷地向AudioTrack的緩沖區“寫入”音頻數據,注意,這個過程一定要及時,否則就會出現“underrun”的錯誤,該錯誤在音頻開發中比較常見,意味著應用層沒有及時地“送入”音頻數據,導致內部的音頻播放緩沖區為空。
(4) 停止播放,釋放資源

AudioTrack的參數配置:

  • 「streamType」 這個參數代表著當前應用使用的哪一種音頻管理策略,當系統有多個進程需要播放音頻時,這個管理策略會決定最終的展現效果,該參數的可選的值以常量的形式定義在 AudioManager 類中,主要包括:
STREAM_VOCIE_CALL:電話聲音
STREAM_SYSTEM:系統聲音
STREAM_RING:鈴聲
STREAM_MUSCI:音樂聲
STREAM_ALARM:警告聲
STREAM_NOTIFICATION:通知聲
  • 「sampleRateInHz」 采樣率,從AudioTrack源碼的“audioParamCheck”函數可以看到,這個采樣率的取值范圍必須在4000Hz~192000Hz之間。
  • 「mode」 AudioTrack提供了兩種播放模式,一種是static方式,一種是streaming方式,前者需要一次性將所有的數據都寫入播放緩沖區,簡單高效,通常用于播放鈴聲、系統提醒的音頻片段; 后者則是按照一定的時間間隔不間斷地寫入音頻數據,理論上它可用于任何音頻播放的場景。可選的值以常量的形式定義在AudioTrack類中,一個是MODE_STATIC,另一個是MODE_STREAM,根據具體的應用傳入對應的值即可。

音頻錄制選擇

MediaRecorder是一個高級別的音頻/視頻錄制工具,集成了錄音、編碼、封裝復用等功能,操作起來相對簡單。錄制的音頻文件經過壓縮處理,并可以直接使用系統自帶的播放器進行播放。MediaRecorder的簡單易用性使其適用于對音頻處理要求不高的場景。由于它更多地是系統音頻API的封裝,對于需要實時處理音頻、進行網絡傳輸或直播等高級應用場景,可能并不適用。

AudioRecord則更加接近底層,提供了更加靈活和自由的音頻采集和處理能力。支持多種音頻編碼格式,如PCM、WAV、MP3等,可以滿足不同場景下的需求。AudioRecord還設計了靈活的數據處理接口,可以方便地添加自定義的音頻處理模塊,實現如混響、均衡器等效果。這使得AudioRecord在需要對音頻進行進一步算法處理、采用第三方編碼庫進行壓縮、進行網絡傳輸和直播等高級應用場景中表現出色。AudioRecord還具有線程安全、性能優異、可擴展性強等特點,保證了其在多線程環境中的穩定運行,并預留了豐富的接口供拓展定制。

對于音頻處理要求不高的場景,可以選擇使用MediaRecorder,簡單易用,能夠直接錄制并播放壓縮后的音頻文件。對于需要對音頻進行進一步算法處理、采用第三方編碼庫進行壓縮、進行網絡傳輸和直播等高級應用場景,推薦使用AudioRecord,提供了更加靈活和自由的音頻采集和處理能力。

音頻播放選擇

在選擇時需要考慮以下因素:

  • 「音頻文件的類型」:如果需要播放長時間的音樂或視頻文件,MediaPlayer可能是更好的選擇;如果需要播放短音頻片段,可以考慮使用SoundPool。
  • 「播放需求」:如果需要同時播放多個音頻,SoundPool是一個很好的選擇;如果需要對音頻進行更精細的控制,例如調整音量、播放速率等,那么AudioTrack可能更適合。
  • 「性能需求」:SoundPool通常具有較低的CPU占用率和反應延遲,適合性能要求較高的應用;而AudioTrack由于更底層,可能需要更多的開發工作,但可以實現更高級別的音頻處理和控制。

MediaPlayer主要用于后臺長時間播放本地音樂文件或在線流媒體文件。提供了一個高層次的封裝,使播放音頻變得相對簡單。MediaPlayer特別適合那些需要連續播放較長時間音頻的應用場景,例如音樂播放器或視頻播放器。

SoundPool更適合播放較短的音頻片段,如游戲聲音、按鍵聲音、鈴聲片段等。SoundPool可以同時播放多個音頻,并且具有較低的CPU占用率和反應延遲。在需要頻繁播放短音頻的應用中表現出色,例如游戲或通知提示音。

AudioTrack是更加底層的API,主要用于管理和播放單一音頻資源。提供了非常強大的控制能力,適合流媒體播放等場景。AudioTrack需要結合解碼器來使用,對于需要進行底層音頻處理的開發者來說更為適用。


責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2021-07-09 09:24:41

鴻蒙HarmonyOS應用

2021-04-12 17:59:39

WindowsYouTube谷歌

2022-08-15 19:25:56

Android音頻PCM

2015-06-16 10:27:13

iOSAndroid音頻

2023-08-16 08:00:39

API網頁端音頻錄制

2011-12-20 20:40:07

Android

2016-09-12 14:42:24

LinuxOctave音頻文件

2024-02-06 10:04:21

微軟視頻編輯工具

2016-10-31 19:41:50

LinuxOctave音頻文件

2023-01-05 16:51:04

機器學習人工智能

2018-06-06 15:49:06

FPGA音頻處理器

2010-01-27 15:15:13

Android多媒體錄

2022-12-25 17:49:55

Ubuntu媒體音頻Linux

2009-06-12 08:57:56

Unix字符串處理

2013-08-07 14:04:22

MySQL備份

2011-08-01 14:42:47

iPhone 應用程序 聲音

2010-04-21 01:59:54

WindowsServSQLServer20微軟

2011-09-05 18:08:01

MTK音頻播放器

2009-08-24 10:10:43

音頻搜索Google List

2015-09-16 16:38:10

QmmpWinampUbuntu
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合伊人 | h视频在线播放 | 国产精品免费一区二区三区四区 | 欧美日韩三级 | 久久久久久国产精品 | 欧美在线观看一区 | 在线观看中文字幕av | 久久久久久蜜桃一区二区 | 天堂资源最新在线 | 精品无码久久久久久久动漫 | 国产精品亚洲第一 | 91福利在线观看视频 | 97超碰人人 | 国产一区二区中文字幕 | 九九久久精品 | 久草网址| 精品一区二区三区中文字幕 | 欧美一区二区在线 | 亚洲精品区 | 国产午夜在线 | 毛片网站在线观看 | 亚洲一区免费视频 | 亚洲午夜网| www.久久 | 欧美性大战久久久久久久蜜臀 | 日本免费视频在线观看 | 天天躁日日躁狠狠的躁天龙影院 | 欧美在线观看一区二区 | 欧美日韩国产在线观看 | 国产91在线 | 亚洲 | 波多野结衣一区二区三区在线观看 | 日本免费一区二区三区视频 | 久久精品这里 | 久色视频在线 | 国产精品天堂 | 久久99精品久久久久久秒播九色 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 卡通动漫第一页 | 蜜桃日韩| 国产伦一区二区三区久久 | 日本不卡视频 |