1. 程式人生 > >使用VS2015新增對ffmpeg新增h265 支援。

使用VS2015新增對ffmpeg新增h265 支援。

最近有人問我hls 是否支援h265,經過一番查詢資料應該是不支援的。但是有人卻不依不饒的問是否vlc 支援hls 支援h265,於是我想測試一番,翻出原來的推流程式碼,

把 pCodecOut = avcodec_find_encoder(AV_CODEC_ID_H264);這句程式碼改成  pCodecOut = avcodec_find_encoder(AV_CODEC_ID_H265);,經過debug 發現返回的null

想起來當初沒有把h265 加入到ffmpeg中,擼起袖子開幹吧。

     1、 首先從官方下載http://hg.videolan.org/x265程式碼,使用cmake 生成vs工程,build 完成 ,生成目標檔案,將標頭檔案,和libx264.lib 複製到指定的目錄(可以讓編譯器找的到相應的庫)。

  2、下載安裝msys2 ,藉助msys2 來執行ffmpeg 的shell 指令碼。在bash裡,在ffmpeg 目錄下,執行./configure --toolchain=msvc --enable-gpl --enable-nonfree  ... --enable-libx265。經過一段時間的執行,bash 報錯,using libx265 without pkg-con53fig.fig。經過百度,發現要配置pkg-config 也比較麻煩,還有pkg-config 可能和mingw 配合比較好,msvc 壓根沒有沒啥用啊。這種用法,於是我只能去修改configure,中找到了如下程式碼:

 enabled libx265           && use_pkg_config x265 "x265.h" x265_encoder_encode -lx265 ||
                             { check_cpp_condition x265.h "X265_BUILD >= 57" ||
                               die "ERROR: libx265 version must be >= 57."; }

改成了

 enabled libx265           && use_pkg_config x265 "x265.h" x265_encoder_encode -lx265 ||
                             { check_cpp_condition x265.h "X265_BUILD >= 57" ||
                               die "ERROR: libx265 version must be >= 57."; }

繼續configure 完成後看到encoder列表中有h265 ,表示配置完成。

然後使用make 命令進行編譯。 連結到一半的時候報錯,x265_api_get_68 無法引用的符號錯誤。此時,我馬上收索,x265_api_get_68 發現程式碼裡面並沒有這個函式,

最後我翻了x265的標頭檔案裡面,發現有一段巨集,,x265_api_get_68 被巨集定義搞成了,x265_api_get ,因此ffmpeg無論哪個版本都可以 ,x265_api_get_68呼叫。改了還是出錯。因此庫沒有正確的引用,最後在libx265.c 程式碼開頭加上,#pragma comment(lib,"x265.lib"),最後make 一下生成了dll,

將dll 替換以後原先的程式碼可以工作了,推流到EasyDarwin 上,本地用vlc 播放,發現流量基本上是h264 的一半。效果還不錯。