原创 mac下編譯nginx + rtmp

brew方式安裝,簡單,但是有兩個很蛋疼的地方, 第一是不能指定版本號,第二是安裝完以後,nginx的目錄到處都是,不便於管理。簡直反人類,無法忍受。 但是還是說下安裝方式: brew tap denji/homebrew-nginx b

原创 流監控(二)

之前博客介紹過實現七牛雲後臺那樣的碼流監控曲線。 但是仍然不能滿足一些需求,比如我們測試的時候,需要知道是否出現卡頓,畫面是否跳幀(丟畫面), 音頻丟幀,在什麼時間點出現,且爲什麼出現的,需要還有數據回放。光靠一個曲線圖,太弱了,所以我寫

原创 muxer mp4

簡單描述h264文件結構: 0001+sei+0001+sps+0001+pps+001/0001+IDR+0001+p1+0001+p2...+0001+sps+0001+pps+0001+IDR+0001+p1+0001+p2...

原创 幀率轉換:丟幀補幀策略

某些時候,我們會遇到一個需求,就是輸入幀率是25,輸出幀率是30.或者30到25等等幀率由小到大,或由大到小, 且輸出幀率是固定幀率。這種情況下,就涉及到要做丟幀或補幀處理。 比如輸入25,輸出30,那麼就需要補5幀,如果輸入30,輸出2

原创 關於音頻轉碼的重要說明(2019/9/03日更新)

之前代碼中使用AudioFifo,請改成 int convert = swr_convert(inputstream->swrCtx, audio_data_buffer, audiosrcFrame->nb_samples,

原创 幾個建議

幾個建議 1,自己計算實際幀率,而不是相信播放器告訴你的那個值 2, 計算你的編解碼速度,是否跟的上你的幀率。 3. 打印輸入幀率,輸出幀率,是個好習慣 4. 80%-90%的問題都是你的pts dts 錯誤 5. 多看博客,

原创 全網最深刻的理解音頻轉碼swr_convert(2019/10/29已補充修正)

之前關於ffmpeg的博客,認可度還蠻高的,我也很受鼓舞,不過也有些汗顏,以前的博客不排除也有因爲當時理解不夠深刻,而 出現代碼寫的也可能有問題。所以我也有必要把我現在爲止的一些理解再分享出來,絕對是乾貨。今天只說音頻。 swr_conv

原创 windows下MinGW編譯ffmpeg+x264+lame+fdk-aac

關於編譯環境的搭建,網上很多,主要說下編譯中遇到的坑, ffmpeg2.8.1 x264-snapshot-20170521 lame3.99.5 fdk-aac-0.1.4 mingw32-4.8.2.rar MSYS-1.0.11.r

原创 內存分析(一)AVPacket

先拋一個球,從一段代碼開始 AVPacket packet; av_init_packet(&packet); packet->data = NULL; packet->size = 0; while (av_read_frame(if

原创 ffmpeg 單線程本地mp4 rtmp推流

//dbt_rtmp.h #include <stdio.h> #include <stdint.h> #include <malloc.h> #include <windows.h> #include <queue.h> #in

原创 mac下FFmpeg繼承VMAF

vmaf是一款視頻質量評估工具,簡單說,就查看轉碼處理後的受損視頻對比原視頻,視頻質量打分是多少。 vmaf目前最新版本是v1.5.1, 工程基於python3。 而本文使用的是vmaf v1.3.4, 因爲ffmpeg不支持vmaf v

原创 mp3轉aac,用AVAudioFifo緩衝pcm數據

swr_convert的第三個參數,不能傳輸出的frame_size,因爲mp3轉aac,1152-》1024,採樣數會溢出,導致fifo並不是滿的。數據會丟。所以換成了傳input frame的nb_samples,這樣,不論是

原创 內存分析(二) AVFrame

AVFrame結構體內有很多成員變量,我們肯定不可能都分析,只關心我們需要的,從實際應用場景出發,用到avframe只要有4個場景,1,init,2,decode,3 encode 4,free 從decode說起,decode涉及的函數

原创 實現一個阻塞與非阻塞兩種方式的環形緩衝區RingBuffer

RingBuffer的實際使用場景很多.下面分別寫了阻塞和非阻塞兩種模式的代碼。 非阻塞模式可以自己替換ffmpeg裏面的fifo(同一線程先寫後讀),如果我們不想使用fifo,就可以直接使用下面的代碼。 如果是用SDL播放audio,存

原创 接上篇CGNonBlockRingBuffer的改版

CGNonBlockRingBuffer的邏輯方式還是稍顯複雜。現在分享srs開源項目中用到的SrsBuffer,也能滿足我們的CGNonBlockRingBuffer同樣的需求(完美替換ffmpeg裏面的fifo)。而且代碼更簡單。 以