javaCV系列文章:
javaCV開發詳解之2:推流器實現,推本地攝像頭視頻到流媒體服務器以及攝像頭錄制視頻功能實現(基於javaCV-FFMPEG、javaCV-openCV)
javaCV開發詳解之3:收流器實現,錄制流媒體服務器的rtsp/rtmp視頻文件(基於javaCV-FFMPEG)
javaCV開發詳解之4:轉流器實現(也可作為本地收流器、推流器,新增添加圖片及文字水印,視頻圖像幀保存),實現rtsp/rtmp/本地文件轉發到rtmp流媒體服務器(基於javaCV-FFMPEG)
javaCV開發詳解之5:錄制音頻(錄制麥克風)到本地文件/流媒體服務器(基於javax.sound、javaCV-FFMPEG)
javaCV開發詳解之6:本地音頻(話筒設備)和視頻(攝像頭)抓取、混合並推送(錄制)到服務器(本地)
javaCV開發詳解之7:讓音頻轉換更加簡單,實現通用音頻編碼格式轉換、重采樣等音頻參數的轉換功能(以pcm16le編碼的wav轉mp3為例)
補充篇:
音視頻編解碼問題:javaCV如何快速進行音頻預處理和解復用編解碼(基於javaCV-FFMPEG)
音視頻編解碼問題:16/24/32位位音頻byte[]轉換為小端序short[],int[],以byte[]轉short[]為例
補充:解決javaCV的FFmpegFrameRecorder中dts為空導致播放器過快解碼進而導致畫面時快時慢等影響視頻正常解碼播放的問題,目前解決辦法如下:
注意:本代碼已提交給javacv,目前1.4.4-snapshot版本已修復該問題
修改 FFmpegFrameRecorder中的recordPacket(AVPacket pkt) 方法
(1)注釋掉pkt.dts(AV_NOPTS_VALUE);
(2)在視頻幀writePacket之前增加:
pkt.dts(av_rescale_q_rnd(pkt.dts(), in_stream.time_base(), video_st.time_base(),(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)));
(3)在音視幀writePacket之前增加:
pkt.dts(av_rescale_q_rnd(pkt.dts(), in_stream.time_base(), audio_st.time_base(),(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)));
javaCV開發詳解之4:轉流器實現中我們使用了Grabber和Recorder的garbFrame和recordFrame實現轉流,但是這種方式消耗很大,通過javacv源碼發現garbFrame實際上進行decode操作(也就是把h264編碼數據解碼為yuv數據並保存到Frame對象中,然后在recordFrame中把Frame中的yuv圖像像素數據又通過encode為h264編碼數據,音頻部分則是在garbFrame時先解碼成pcm數據,然后在garbFrame中編碼為aac),這兩部分的編解碼操作非常耗資源,顯然會影響到轉流的整體效率。
完整閱讀本章:https://blog.csdn.net/eguid_1/article/details/83025621