簡體   English   中英

如何使ffmpeg像Android的內置視頻查看器一樣高效?

[英]How can ffmpeg be made as efficient as Android's built-in video viewer?

我有一個基於https://ikaruga2.wordpress.com/2011/06/15/video-live-wallpaper-part-1/的項目,它使用來自http:// bambuser的ffmpeg庫的舊版本。 com / opensource 在這個項目的C ++代碼中,我們有以下幾行代碼:

        unsigned long long current = GetCurrentTimeInNanoseconds();
        avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, packet.data, packet.size);
        __android_log_print(ANDROID_LOG_DEBUG, "getFrame>>>>", "decode video time: %llu", (GetCurrentTimeInNanoseconds() - current)/1000000);

此代碼使用1280x720 h264源視頻文件連續報告60到90毫秒,以解碼Xperia Ion上的每個幀。 將幀輸出到屏幕的其他處理平均需要30ms,而變化非常小。 這導致幀速率為10-11fps。

忽略其他處理,平均75ms的解碼將導致13fps。 但是,當我瀏覽我的SD卡並單擊該mp4文件以在本機查看器中打開它時,它以完整的30fps顯示。 此外,當我在本機查看器中打開相同mp4的1920x1080版本時,它也以完整的30fps運行而沒有卡頓或延遲。 這意味着(對於我的新手來說)某些東西是非常錯誤的,因為硬件顯然能夠快速解碼很多倍。

可以將哪些標記或選項傳遞給avcode_decode_video以優化解碼速度以匹配本機查看器的速度? 可以在其他地方進行優化以進一步優化速度嗎? 是否有原因使本機查看器可以快速解碼幾乎一個數量級(考慮到1920x1080源結果)?

編輯

下面的答案非常有用,但目前對我來說不實用。 與此同時,我已經設法將解碼時間縮短了70%,並通過許多小時的試驗和錯誤找到了一些最佳編碼標記。 以下是我用於編碼的ffmpeg參數,以防它可以幫助其他任何偶然發現此帖子的人:

        ffmpeg.exe -i "#inputFilePath#" -c:v libx264 -preset veryslow -g 2 -y -s 910x512 -b 5000k -minrate 2000k -maxrate 8000k -pix_fmt yuv420p -tune fastdecode -coder 0 -flags -loop -profile:v main -x264-params subme=5:ref=4 "#ouputFilePath#"

通過這些設置,ffmpeg在20-25秒內解碼幀,雖然使用sws_scale然后寫出紋理,我仍然在Xperia Ion上以大約22 FPS的速度徘徊,分辨率低於我想要的。

本機查看器使用硬件h264解碼器,而ffmpeg 通常僅使用軟件編譯 您必須使用libstagefright構建ffmpeg。

libstagefright選項已被拉出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM