目標:
關注聲音回調函數與 聲音解碼函數的關系
關注視頻幀調用過程
未完成
測試案列:
測試平臺:
測試代碼:
首先來說,為什么可以出聲音,我認為是這個函數 SDL_pauseAudio 的行為.
### 關注聲音回調函數與 解碼的關系
用數據來說話,分別在兩個位置下斷點
位置一是:audio_callback函數位置
位置二是:audio_decode_frame解碼函數位置
讓我們來看看實際的代碼:
~~~
void audio_callback(void *userdata, Uint8 *stream, int len) {
AVCodecContext *aCodecCtx = (AVCodecContext *)userdata;
int len1, audio_size;
static uint8_t audio_buf[(MAX_AUDIO_FRAME_SIZE * 3) / 2];
static unsigned int audio_buf_size = 0;
static unsigned int audio_buf_index = 0;
while(len > 0) {
if(audio_buf_index >= audio_buf_size) {
~~~
~~~
/* We have already sent all our data; get more */
audio_size = audio_decode_frame(aCodecCtx, audio_buf, audio_buf_size);//請特別注意。
~~~
~~~
if(audio_size < 0) {
/* If error, output silence */
audio_buf_size = 1024; // arbitrary?
memset(audio_buf, 0, audio_buf_size);
} else {
audio_buf_size = audio_size;
}
audio_buf_index = 0;
}
~~~
~~~
len1 = audio_buf_size - audio_buf_index;
if(len1 > len)
len1 = len;
memcpy(stream, (uint8_t *)audio_buf + audio_buf_index, len1);
len -= len1;
stream += len1;
audio_buf_index += len1;
}
}
~~~
結果如下,可以看到至少4次audio_decode_frame后,系統將會調用 回調函數。這樣的回調會周期性發生。
有同學會問,為什么是4次?我想要么是給系統回調的聲音buffer放滿了,要么是audio_callback 定時調用。
~~~
Function: audio_callback(void *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_callback(void *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_callback(void *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_callback(void *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_callback(void *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
Function: audio_decode_frame(AVCodecContext *, unsigned char *, int), Thread: 0x81B8 Win32 線程
~~~
### 關注視頻幀調用過程
之所以貼在這里,想以后再分析,再給出結果。
理論上,12個時刻,應該對應12個不同的幀,但是結果不是,看看以下結果(用notepad++處理后,用于統計個數)。
~~~
Search "video" (11 hits in 1 file)
new 2 (11 hits)
Line 120: read one video frame
Line 286: read one video frame
Line 291: read one video frame
Line 292: read one video frame
Line 293: read one video frame
Line 294: read one video frame
Line 295: read one video frame
Line 296: read one video frame
Line 297: read one video frame
Line 298: read one video frame
Line 299: read one video frame
Search "audio" (288 hits in 1 file)
~~~
###未完成
其他:看看第一次調用audio_callback時,是否遇到返回為空的情形。
其他:請打印出每次解碼出的buffer大小,尤其注意那個中間連續調用五次解碼的過程。
其他:是否可以結合dump出的文件信息,量化分析過程。