首先说明,ffmpeg并非做得毫无破绽。
udp 改成tcp传输并非一定不会丢包,这个一定要清楚,除此之外,如果使用udp,一定要把udp的接收缓存加得合适接收一个长帧。
我们知道用parse 解析一帧是否被粘合或者分片,ffmpeg这一点做得很好了,具体函数:
av_parser_parse2,如果遇到h265花屏,很有可能我们需要这个函数会做得更好一些。
修改代码有用吗,有用,就是把错误的地方直接返回错误,而不让ffmpeg修复,小型修复是有用的,h264和h265本身就是纠错类型的,但是包错误多,例如包不足够,ffmpeg解码只能让我们看到绿色或者灰色了。修改后的ffmpeg不纠错,结果不花屏了,可是,跳秒我们也接受不了啊
足够多的测试以后,发现,有的并非是网络丢包,而是ffmpeg解码并不完整,同样的网络视频包解码,硬件解码无错误,软解码就会有一堆错误,所以,我们发现:最好多使用硬件解码。即使我们的包是排着队列进入的,测试结果发现,ffmpeg软解码对于h265解码,是不够完整的。
hevc_refs.c 里面
add_candidate_ref 函数
if(!ref){
//return AV_ERROR_INVALIDDATE;
//以下不产生纠错,就不会错了,注释掉下面的,直接返回,就不会灰了
ret = generate_missing_ref(s,poc);
if(!ref)
return AVERROR(ENOMEM);
}
编译脚本:
Sudo lshw -numberic -C display
https://blog.csdn.net/qq_27386899/article/details/104113553
sudo apt install nvidia-driver nvidia-cuda-dev nvidia-cuda-toolkit nvidia-nsight nvidia-visual-profiler
sudo apt-get -y install autoconf automake build-essential libass-dev libfreetype6-dev libsdl2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev
./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --enable-shared –disable-static --disable-debug
–extra-cflags=-I/usr/include --extra-cflags=-fPIC –extra-ldflags=-L/usr/lib/
./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --disable-static --disable-debug --enable-shared --extra-cflags=-I/usr/include --extra-ldflags=-L/usr/lib/cuda –extra-cflags=-fPIC
./configure --prefix=./build --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/include --extra-cflags=-fPIC --extra-ldflags=-L/usr/lib/cuda --enable-shared --enable-pic
./configure --prefix=./build –disable-static --enable-shared --enable-pic --disable-debug --enable-cuda --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/include --extra-cflags=-fPIC –extra-ldflags=-L/usr/lib/cuda
./configure --prefix=./build --disable-static --enable-shared --enable-pic --disable-debug --enable-cuda --enable-cuvid --enable-nvenc --extra-cflags=-I/usr/include --extra-cflags=-fPIC --extra-ldflags=-L/usr/lib/cuda
./configure --prefix="./build" --pkg-config-flags="–static" --extra-cflags=-I./build/include --extra-ldflags="-L./build/lib" --extra-libs="-lpthread -lm" --enable-gpl --enable-libx264 --enable-nonfree --enable-cuda --enable-cuvid –enable-nvenc
./configure --enable-cuda --enable-cuvid --enable-nvenc --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --prefix=./build
安装nvcodecheader
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
$ cd nv-codec-headers $ make $ sudo make install
./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-shared --enable-pthreads --enable-postproc --enable-gpl --enable-libfreetype --disable-static --disable-debug --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --prefix=./build
CUDA_HOME=/usr/local/cuda/
export PATH= P A T H : PATH: PATH:CUDA_HOME/bin/
export LD_LIBRARY_PATH= L D L I B R A R Y P A T H : LD_LIBRARY_PATH: LDLIBRARYPATH:CUDA_HOME/lib64