㈠ android平台FFmpeg實現rtmp推流-C++的實現
視頻編碼有幾種方式:
1.硬編碼,使用MediaCodec實現
2.軟編碼,使用FFmpeg或者libx264庫來實現。
本文分享在Android平台視頻編碼-軟編碼的實現,也就是用FFmpeg來實現視頻的編碼,rtmp推流到伺服器上,相機採集視頻將在下一篇文章分享。
流媒體伺服器使用 nginx-rtmp-mole 來進行搭建。
本文所使用FFmpeg的版本是4.1,關於FFmpeg編譯成Android平台so庫如果有需要,我將在下一篇文章分享說明。
視頻編碼比較耗cpu,上傳視頻數據的會耗網路io,所以需要開啟新線程去處理,這里我用HandlerThread來處理視頻的編碼上傳。
初始化編碼相關操作
這里我們使用的是FFmpeg,所以在編碼前我們會先做一些初始化以及參數設置工作。
FFmpeg初始化
av_register_all()
創建輸出格式上下文
avformat_alloc_output_context2()
獲取編碼器
avcodec_find_encoder(AV_CODEC_ID_H264) 獲取H264的編碼器
設置編碼器參數
使用給定的編碼器和參數初始化編碼上下文
avcodec_open2(pCodecCtx, pCodec, ¶m)
創建視頻流
video_st = avformat_new_stream(ofmt_ctx, pCodec)
打開輸出上下文
avio_open(&ofmt_ctx->pb, out_path, AVIO_FLAG_READ_WRITE)
寫入輸出頭信息
avformat_write_header(ofmt_ctx, NULL)
像素格式轉換
AV_PIX_FMT_YUV420P,它是純平面存儲。總共三個平面,分別存放,Y、U、V數據。
當圖像寬是width,高是height時,Y分量的大小就是width×heitht,而U是width×heitht/4,V也是U是width×heitht/4。
H264編碼
首先我們需要了解兩個數據結構AVFrame、AVPacket
AVFrame存放的是原始數據、AVPacket存放的是編碼後的數據。
創建AVPacket
av_new_packet(&enc_pkt, picture_size);
開始編碼
ret = avcodec_encode_video2(pCodecCtx, pFrameYUV);
輸出一幀編碼後的視頻數據
ret = av_write_frame(pCodecCtx, &enc_pkt);
釋放資源
小夥伴們有疑問的可以在下方評論區評論。
㈡ Android中使用FFmpeg得到視頻中的PCM和YUV數據
使用FFmpeg獲取PCM和YUV數據的流程基本上一樣的,下面就以獲取YUV數據的流程為例,說明這個過程:
㈢ Android NDK開發之旅38--FFmpeg視頻添加水印
Android NDK開發之旅 目錄
Android也是利用FFmpeg命令行的形式(混編),進行視頻轉碼壓縮。
水印位置參數的第一個數值是水印圖片的左上角的x軸像素值,第二個數值是水印圖片的左上角的y軸像素值。
水印位置參數除了使用數值外,還可以使用以下幾個參數:
對應地可以將overlay參數設置成如下值來改變水印圖片的位置:
所以質量會下降,在參數中添加設置 如:-b 1024k 會提高視頻質量
㈣ 如何在Android上集成ffmpeg
下面把具體編譯步驟描述如下,假定NDK安裝在~/android-ndk-r7:
1. 首先從FFmpeg官網下載最新的release版本源碼ffmpeg-0.11.tar.gz解壓縮到Android源碼樹的ffmpeg/下。
2 准備一個編譯腳本build_android.sh並放在ffmpeg/下面,這個腳本也是Rockplayer提供的,需做一些修搜索改,其內容附在後面。我目前用的也會附在後面。
3 在ffmpeg目錄下運行./build_android.sh開始編譯FFmpeg,編譯好的libffmpeg.so會放在文件夾android裡面,一共有3個版本分別對應3種ARM體系結構,包括armv7-a、armv7-a-vfp、armv6_vfp,根據所運行的硬體平台選取其中一個版本。為了編譯使用FFmpeg的程序時可以方便地找到libffmpeg.so,可將它復制到$OUT/system/lib/和$OUT/obj/lib/,當然這一步也可以加在build_android.sh中做。
4. 接下來就是編譯可執行文件ffmpeg了,這個工具可以在命令行下完成FFmpeg提供的幾乎所有功能包括編碼、解碼、轉碼等,也是用來調試和驗證很有用的工具。其實上述編譯完後在$ANDROID_BUILD_TOP/external/ffmpeg/下也會生成ffmpeg,但是在設備上無法運行。為了編出能在設備上運行的ffmpeg,可以寫一個簡單的Android.mk
㈤ (四)Android通過ffmpeg解碼音頻
音頻解碼與視頻解碼的流程大致相同,唯一的區別只有處理幀數據的時候,視頻是像素轉換並顯示,而音頻則是重采樣並播放。
所以基於這一點,在以後做架構的時候,可以將音頻、視頻這兩部分,相同的邏輯放在共同的父類當中,自身子類則各自處理視頻顯示和聲音播放等邏輯。
然後,就是將重采樣後的數據,交給OpenSLES去處理。
OpenSL ES 全稱為: Open Sound Library for Embedded Systems,是一個針對嵌入式系統的開放硬體音頻加速庫,支持音頻的採集和播放,它提供了一套高性能、低延遲的音頻功能實現方法,並且實現了軟硬體音頻性能的跨平台部署,大大降低了上層處理音頻應用的開發難度。
Object 和 Interface 是OpenSL ES 中的兩大基本概念,可以類比為 Java 中的對象和介面。在 OpenSL ES 中, 每個 Object 可以存在一系列的 Interface ,並且為每個對象都提供了一系列的基本操作,如 Realize,GetState,Destroy 等。
重要的一點,只有通過 GetInterface 方法拿到 Object 的 Interface ,才能使用 Object 提供的功能。
這里的例子是播放一個手機里的視頻文件,所以只介紹OpenSLES Audio Player 播放音頻的過程。
音頻播放的大致流程就是這樣,其實還有音頻錄入的功能的,這個以後再介紹。音頻的解碼,大部分都和視頻解碼的流程一致,只要你熟悉OpenGLES的幾個API和流程,基本都能播放成功。
㈥ 如何在Android上集成ffmpeg
下面把具體編譯步驟描述如下,假定NDK安裝在~/android-ndk-r7:
1. 首先從FFmpeg官網下載最新的release版本源碼ffmpeg-0.11.tar.gz解壓縮到Android源碼樹的ffmpeg/下。
2 准備一個編譯腳本build_android.sh並放在ffmpeg/下面,這個腳本也是Rockplayer提供的,需做一些修改,其內容附在後面。目前用的也會附在後面。
3 在ffmpeg目錄下運行./build_android.sh開始編譯FFmpeg,編譯好的libffmpeg.so會放在文件夾android裡面,一共有3個版本分別對應3種ARM體系結構,包括armv7-a、armv7-a-vfp、armv6_vfp,根據所運行的硬體平台選取其中一個版本。為了編譯使用FFmpeg的程序時可以方便地找到libffmpeg.so,可將它復制到$OUT/system/lib/和$OUT/obj/lib/,當然這一步也可以加在build_android.sh中做。
4. 接下來就是編譯可執行文件ffmpeg了,這個工具可以在命令行下完成FFmpeg提供的幾乎所有功能包括編碼、解碼、轉碼等,也是用來調試和驗證很有用的工具。其實上述編譯完後在$ANDROID_BUILD_TOP/external/ffmpeg/下也會生成ffmpeg,但是在設備上無法運行。為了編出能在設備上運行的ffmpeg,可以寫一個簡單的Android.mk,
㈦ 如何在Android用FFmpeg解碼圖像
注冊, 初始化avformatcontext, 打開視頻流文件。 根據視頻流信息找到對應的codec。 初始化avcodeccontext。 開始循環,初始化一個frame 讀取一個packet, 判斷packet類型, 根據類型,調用對應的(音/視/字幕)解碼函數。 得到frame。 釋放packet。如果packet的類型是視頻,拷貝 frame->data,釋放frame。 將拷貝後的bytes轉換成bitmap給安卓。
㈧ 如何在Android上集成ffmpeg
1. 首先從FFmpeg官網下載最新的release版本源碼ffmpeg-0.11.tar.gz解壓縮到Android源碼樹的ffmpeg/下。 2 准備一個編譯腳本build_android.sh並放在ffmpeg/下面,這個腳本也是Rockplayer提供的,需做一些修改,其內容附在後面。目前用的也會附在後面。 3 在ffmpeg目錄下運行./build_android.sh開始編譯FFmpeg,編譯好的libffmpeg.so會放在文件夾android裡面,一共有3個版本分別對應3種ARM體系結構,包括armv7-a、armv7-a-vfp、armv6_vfp,根據所運行的硬體平台選取其中一個版本。為了編譯使用FFmpeg的程序時可以方便地找到libffmpeg.so,可將它復制到$OUT/system/lib/和$OUT/obj/lib/,當然這一步也可以加在build_android.sh中做。 4. 接下來就是編譯可執行文件ffmpeg了,這個工具可以在命令行下完成FFmpeg提供的幾乎所有功能包括編碼、解碼、轉碼等,也是用來調試和驗證很有用的工具。其實上述編譯完後在$ANDROID_BUILD_TOP/external/ffmpeg/下也會生成ffmpeg,但是在設備上無法運行。為了編出能在設備上運行的ffmpeg,可以寫一個簡單的Android.mk,