使用ffmpeg開發,遇到的問題,整理

Windows10下開發,ffmpeg3.4

問題一:

  • pCodecOut_Audio = avcodec_find_encoder_by_name("libfdk_aac");//什麼也沒有,打不開
  • pCodecOut_Audio = avcodec_find_encoder(AV_CODEC_ID_AAC);  //可以打開

原因:ffmpeg3.4 版本中,AAC編碼器打不開,需要額外的lib_aac庫加入進去。所以後來直接用mp2編碼音頻。mp2編碼的音頻,用win10自帶的播放器,不能播放聲音。換QQ播放器、vlc都可以。

 

問題二:

avcodec_open2(pCodecCtxOut_Audio, pCodecOut_Audio, 0);// 返回-22

win10系統下,下面這個參數設置爲S16,導致avcodec_open2()不能打開,返回-22

改爲FLTP,avcodec_open2() 打開成功。

pCodecCtxOut_Audio->sample_fmt = AV_SAMPLE_FMT_FLTP;  //AV_SAMPLE_FMT_S16;

 

問題三:

avio_open(&pFormatCtx_Out->pb, outFileName, AVIO_FLAG_WRITE);  //可以打開

avformat_write_header(pFormatCtx_Out, NULL);     //返回-22

原因:缺少參數。

問題重現: pFormatCtx_Out, pCodecOut_Audio 這兩個參數設置好了,但是流裏面的codec沒有sample_rate的數據。導致了pFormatCtx_Out,參數不夠,打開失敗。添加了紅色兩行之後,就通過了。

 

 問題四:

輸入流信息已經獲取,現在要賦值輸入流的解碼器,綠框賦值之後,可以avcodec_open2() ; 成功。

如果不用綠框,直接紅框這種方式,則avcodec_open2() 不成功。

如果,有輸入幀且需要編碼的話,採用紅框這種方式,初始化編碼器,然後爲pCodecCtx_Audio_in賦值各種參數,才能使用。

所以,我的程序的正解,就是採用綠框,註釋掉紅框。然後問題5也解決了。

 

問題五:

av_read_frame() 成功,但是avcodec_decode_audio4()失敗。究其原因,是第一個參數即解碼器的參數不對。

改用直接用流的codec 就通過了

 

問題六:

av_audio_fifo_write(fifo_audio, (void **)audioFrame->data, audioFrame->nb_samples);// 運行的時候,崩潰

原因是:fifo_audio的格式sample_fmt 與 audio_Frame的格式不相同。

 空指針。是因爲上面生成的fifo_audio格式與audioFrame->data的格式不匹配,找不到地址。

 

問題七:

未見處理的異常:0xC0000005:讀取位置0xfeeeff22時發生訪問衝突

釋放指針出的問題。在哪裏定義,就在哪裏釋放。注意釋放順序。讀取的數據,結果指針已經被釋放了。

 

問題八:

可能是MFC多線程句柄釋放的問題

 

問題九:

 0xC0000005: 讀取位置 0xfeeefeee 時發生訪問衝突

原因:說明指針所指向的空間已經被釋放。

其實電腦開機後物理內存的每個字節都是可讀寫的,從來不會因爲所謂的new、delete或malloc、free而被創建、銷燬。區別僅在於操作系統內存管理模塊在你讀寫時是否能發現並是否採取相應動作而已。操作系統管理內存的粒度不是字節而是頁,一頁通常爲4KB。

 

問題十:

音頻的重採樣。

如果採樣的音頻各種格式和要輸出的採樣的各種格式不同,那麼就需要重採樣,否則無法輸出。

比如:pcm_s16 重採樣爲 AAC,先記錄下重採樣的學習地址,稍後再整理。

http://codepad.org/qoknuYAB

https://www.jianshu.com/p/314a929f99fc

https://www.jianshu.com/p/bf5e54f553a4

https://blog.csdn.net/hiwubihe/article/details/81259134

 

問題十一:

錄製MP4成功,但是播放的時候,畫面有問題,花屏,模糊。

是因爲視頻碼率設置出了問題。參數設置的不對。後來,直接把ffmpeg-dev版中的sample----encode_video的參數拿來用,解決問題。還是因爲基礎不夠紮實,不知道如何根據屏幕大小自動設置碼率。整理基礎知識

 

問題十二:

avformat_open_input(); 返回-2. 裏面的參數,初始化也失敗。

錯誤原始: 沒有添加初始化:av_register_all(); // 添加之後,正常打開。

 

avformat_open_input(); 返回-22. 提示無效參數。

是因爲有如下設置:將前兩行用最後一行替換,就可以了。

//const char * screen_size = "352x288";

//av_dict_set(&options,"video_size", screen_size, 0);

av_dict_set(&options,"video_size", "352x288", 0);

 

問題十三:

ret = avcodec_open2(pCodecCtx, pCodec, NULL);

返回 ret = -542398533

是因爲,錄屏的時候,不小心,把屏幕參數,設置成了"352x255"。所以pCodecCtx->height就變成了奇數,然後就報錯了。好像屏幕的尺寸,不可以有奇數。 將尺寸改爲 "352x288"這個是正確的參數,就可以正常打開了。

 

問題十四:

EnterCricalSection(); // 這裏總是報錯

CapScreen_MFC_2.exe 中的 0x77883cb3 處有未經處理的異常: 0xC0000005: 寫入位置 0x00000014 時發生訪問衝突

原因是:沒有對VideoSection初始化

在主函數中,添加:

InitializeCriticalSection(&VideoSection);            // 使用臨界區對象之前,必須初始化 臨界區對象

 

問題十五:

有三個線程,但是隻運行了1個線程。原因是:名字寫錯了。手誤害si人。

應該是寫成:trhead1, thread2, thread3. 因爲寫錯,導致只運行了thread1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章