ffmpeg
文章平均质量分 62
主要与ffmpeg开发过程中遇到的问题解决,测试记录,以工程为导向完成的这个专栏
、、、、南山小雨、、、、
秋风吹湘水,落叶满南山.
展开
-
ioctl方式采集/dev/videoX
应用程序通过API接口提供的方法(VIDIOC_REQBUFS)申请若干个视频数据的帧缓冲区,申请帧缓冲区数量一般不低于3个,每个帧缓冲区存放一帧视频数据,这些帧缓冲区在内核空间。设置视频的制式,制式包括PAL/NTSC,使用ioctl(fd_v4l, VIDIOC_S_STD, &std_id)设置视频帧格式,包括帧的点阵格式,宽度和高度等,使用ioctl(fd_v4l, VIDIOC_S_FMT, &fmt)设置视频的帧率,使用ioctl(fd_v4l, VIDIOC_S_PARM, &parm)原创 2024-07-09 13:17:49 · 388 阅读 · 0 评论 -
ffmpeg抠图
3.图片抠图透明 (1.)mp4扣yuv图,(2)用1. (3)用抠图算法函数对yuv进行处理。对于TJTV.png,可以看到它的编码和封装方式都是png,它的像素格式为rgba。透明的原理是对rgb数据逐个像素处理,修改rgb值,达到对特定的像素进行透明标记。0x0000FF:六位每两位分别表示红绿蓝,因此它是对rgb像素进行透明标记。这个命令只能对rgb的像素格式进行透明标记,但是对yuv得不能,会导致花屏。0.5表示蓝色的范围容差值,范围为0-1,数值越大,容错越大。原创 2023-09-19 12:03:13 · 1404 阅读 · 1 评论 -
av_buffersink_get_frame_flags接口注意事项
1.在使用这个函数时需要注意,它每次都会给result_frame分配空间,因此每次在使用前都需要释放之前的空间,frame av_frame_unref(result_frame);5.av_buffersrc_close()关闭时需要给好pts,也就是EOF时总共时长。2.这个函数会把frame里的一些字节拷贝到result_frame,比如宽高,pts。3.add一帧A数据,就可以从get得到A数据,不存在缓存。4.add用的一个宏。原创 2023-09-06 15:44:13 · 514 阅读 · 0 评论 -
qsv滤镜使用遇到的各种报错
若未经映射,即使有地址如praw_frame->data,一读写就报错),笔者环境为intel N6000,4核4线程,切换为这种方式后,id节省了10%。这个接口的问题是,从GPU->CPU的数据拷贝,过于消耗cpu,也费时,远大于系统内存之间的拷贝,可能因为显卡是外设的原因吧。加上像素格式转换就正常了呢,因此可以看出滤镜的像素格式转换拥有av_hwframe_transfer_data的能力。我们用滤镜如下,用2.映射地址的方式,将sw_pframe传入滤镜。2.将显存中的数据映射成可以访问的数据。原创 2023-09-06 11:34:43 · 811 阅读 · 0 评论 -
ffmpeg5及以上-s和像素格式转换 花屏问题
拉下ffmpeg源码,6.0.1,4.3.6,5.1.4,依次安装作实验。原创 2023-11-14 23:29:58 · 545 阅读 · 0 评论 -
ffmepg滤镜
overlay 滤镜需要两个视频输入,但此处并未为 overlay 滤镜指定输入,因此输入中的头两个有效视频流(A.avi 中的 stream 0 和 C.mkv 中的 stream0)会被作为 overlay 滤镜的输入。滤镜之间用",“隔开,构成滤镜链,滤镜链条之间用”;针对简单的,也就是只有一个输入和输出的滤镜图,用-vf -af,官网如图,它的处理过程是线性的,执行完一个滤镜,再执行下一个滤镜。一个滤镜图也可以只有一个滤镜链,一个滤镜链可以只包含一个滤镜,这种特例情况下,一个滤镜图只包含一个滤镜。原创 2023-08-11 17:25:49 · 2008 阅读 · 0 评论 -
USB采集卡如何打pts
一、使用采集卡提供的pts二、手动打pts1.usb采集设备pts的问题2.采集卡驱动,UVC/UAC,ffmpeg的关系3.如何自己打pts4.音视频同步调优5.NTP等联网调时工具带来的不同步问题一、使用采集卡提供的pts我们用和里的方法,用ffmpeg采集后会得到音视频的pts。我们应该尽量用好这些pts,因为他们的时间间隔很精准,比如48000,每次采集1024,发现每帧间隔21ms;视频采集1080p25,每帧间隔40ms。原创 2023-08-04 13:13:42 · 1614 阅读 · 0 评论 -
ffmpeg的线程安全问题
FFmpeg 6.0及其之后的版本并不是线程安全的。这意味着在多线程环境下同时使用 FFmpeg 的各个组件和函数可能会导致竞态条件和未定义行为。原创 2023-06-26 10:57:12 · 934 阅读 · 0 评论 -
ffmpeg的postproc库
但是自FFmpeg 3.2版本开始,postproc 库被标记为过时(deprecated),不再是默认启用的,而且在最新的 FFmpeg 版本中已经被移除。现在,建议使用更现代和更强大的滤镜系统,如 libavfilter,来实现视频的后处理和滤波操作。postproc 库提供了一些常见的视频后处理滤镜,例如去隔行滤波、去噪滤波、锐化滤波等,可以用于增强视频的清晰度、减少噪点和伪影等。FFmpeg 中的 postproc 库是一个视频后处理库,用于应用各种图像处理滤镜和算法来改善和优化视频质量。原创 2023-06-15 17:20:13 · 1226 阅读 · 0 评论 -
WARNING: library configuration mismatch
【代码】WARNING: library configuration mismatch。原创 2023-06-15 13:43:31 · 559 阅读 · 0 评论 -
支持1080i50的采集卡厂商
Magewell:Magewell 是专门从事视频采集卡和视频转换器的制造商,他们提供了多款USB采集卡,如 Magewell USB Capture HDMI Gen 2 和 Magewell USB Capture SDI Plus。Elgato:Elgato 是一家著名的视频和音频设备制造商,提供了多个型号的USB采集卡,如 Elgato Game Capture HD60 S+ 和 Elgato Cam Link 4K。它们的采集卡通常支持广泛的视频格式和分辨率,包括 1080i50。原创 2023-06-15 09:17:08 · 220 阅读 · 0 评论 -
【ZEGO即构】音视频开发进阶 — 音频要素
音色是一种“感官属性”,我们利用这种“感官属性”,能区分发声的物体,发声的状态,还能评价听感上的优劣,比如“钢琴声、二胡声”,比如“只闻其声,如见其人”,比如“悦耳、动听”等等。前面我们了解到,声音是由物体振动产生的波,而物体整体振动发出的只是基音,其各部分还有复合的振动,这些复合的振动也会发出声音并形成泛音,基音+泛音的不同组合就产生了多样化的音色,声音世界才变得丰富多彩起来。如图 5,我们设定纵轴的坐标取值范围为 0 ~8,得到每个采样点的纵坐标(向上取整),这里的坐标值即为量化后的幅度值。原创 2023-03-17 09:01:54 · 554 阅读 · 0 评论 -
USB摄像头设置采集亮度和对比度
1.设置usb摄像头的亮度和对比度2.ffmpeg中滤镜设置亮度和对比度3.obs中的色彩范围设置。原创 2023-03-15 08:43:24 · 2459 阅读 · 0 评论 -
yuv色彩空间和色彩范围
完整范围使用 0-255 表示所有可能的取值,包括黑色(0)和白色(255),而标准计算机范围则使用 16-235 表示亮度范围,使用 16-240 表示色度范围,排除了极端的黑色和白色值,使亮度和颜色范围更加均衡。在实际的视频处理中,正确指定视频使用的色彩空间非常重要,因为不同的色彩空间之间可能存在差异,如果没有正确指定色彩空间,就可能导致视频颜色不准确、失真等问题。比如,在 bt601 中,亮度的取值范围是 16-235,而在 bt709 中则是 16-235 或 0-255(取决于色彩范围选项)。原创 2023-03-14 14:45:08 · 2376 阅读 · 0 评论 -
ffmpeg推流rtmp指定udp传输
相比之下,UDP 具有低延迟和高实时性的优势,但是 UDP 的可靠性不如 TCP。这种方式被称为 RTMFP (Real-Time Messaging Flow Protocol),它基于 UDP 协议,支持多播和点对点通信,可以用于实现低延迟、高带宽的音视频传输。默认情况下,ffmpeg使用RTMP协议进行推流,但是在某些情况下,TCP协议可能更适合您的需求。在 RTMP 中,TCP 是默认的传输协议,它的稳定性和可靠性比 UDP 更好。-b:v 2000k 表示目标视频的目标比特率为2Mbps。原创 2023-03-14 13:38:31 · 2540 阅读 · 2 评论 -
amd配置ffmepg amf待解决
在/usr/local/include下创建AMF文件夹,然后把amf源码里面的amf/public/include目录下的core和component两个文件夹放到刚才创建的AMF文件夹下,然后编译ffmpeg时加–enable-amf就可以了。下载amd的驱动,安装apt-get install amdgpu-install-22.10.4.50104-1.el9.noarch.rpm。最后再拉:https://github.com/GPUOpen-LibrariesAndSDKs/AMF。原创 2022-11-02 16:12:37 · 1145 阅读 · 0 评论 -
h264编码流程分析
H.264/AVC视频编码标准的数据处理流程仍然是混合编码框架,即基于像素块的运动补偿、变换、量化和熵编码的处理模块。H.264/AVC算法的这些处理模块都做了技术改进,以提高编码效率。典型的视频编码框架如图6-2所示。处理的图像帧分割成多个16×16的宏块,根据图像编码类型I帧、P帧或B帧等,决定是对图像数据本身处理还是对残差编码处理。图像数据本身即帧内编码I帧,利用图像的空间相关性,去除空间冗余。残差编码,首先利用运动估计技术,在一定范围的窗口内搜索相对最佳宏块,然后相减形成残差,同时记录当前宏块的原创 2022-08-19 10:16:53 · 1702 阅读 · 0 评论 -
h264与x264支持的Profile
H.264/AVC定义了4种不同的Profile(类):Baseline Profile(基类)、Main Profile(主类)、Extended Profile(扩展类)和High Profile(高端类)。在Main Profile的基础上新增:8×8帧内预测(8×8 Intra Prediction), 自定义量化(Custom Quant),无损视频编码(Lossless Video Coding),更多的YUV格式(4:2:2,4:4:4),像素精度提高到10位或12位等。.........原创 2022-08-18 08:47:25 · 1018 阅读 · 0 评论 -
ldconfig: /lib64/libswscale.so.5 不是符号连接
发现这些库都有两个相同的,一个是真是库,一个是连接库,现在的问题是连接库找不到它真实连接的那个库了,所有需要手动连接一下。找到这libswscale.so.5,会看到它本来需要连接的库。原创 2022-08-16 18:29:32 · 1987 阅读 · 0 评论 -
ffmpeg推流报错Failed to update header with correct duration.
推流命令如下:ffmpeg -i test_video.mp4 -c copy -f flv rtmp://127.0.0.1/live/livestream需要加上-refmpeg -re -i test_video.mp4 -c copy -f flv rtmp://127.0.0.1/live/livestream使得ffmpeg推流时根据原来视频的帧率进行,如果不设置的话就会报以上错误,因为它会以全速推流。...原创 2022-06-22 11:29:18 · 5777 阅读 · 1 评论 -
AVFrame内存管理api
int av_frame_ref(AVFrame *dst, const AVFrame *src)类似于复制,src复制到dst,不过只是将src里面数据的引用加1,然后将引用添加到dst中AVFrame *av_frame_clone(const AVFrame *src);作用同av_frame_ref类似,增加src的引用计数,但同时会初始化av_frame_clone 对象void av_frame_unref(AVFrame* frame)将frame引用计数减一。av_frame_free原创 2022-06-22 11:10:16 · 701 阅读 · 0 评论 -
AVFrame结构体中变量解释
uint8_t *data[AV_NUM_DATA_POINTERS]:指针数组,存放YUV数据的地方。如图所示,一般占用前3个指针,分别指向Y,U,V数据。对于packed格式的数据(例如RGB24),会存到data[0]里面。对于planar格式的数据(例如YUV420P),则会分开成data[0],data[1],data[2]…(YUV420P中data[0]存Y,data[1]存U,data[2]存V)int linesize[AV_NUM_DATA_POINTERS]:图像各个分量数据在此原创 2022-06-13 08:59:43 · 652 阅读 · 1 评论 -
ffmpeg奇偶场帧Interlace progressive命令和代码处理
一、命令方式查看所有已支持的滤镜ffmpeg -filters查看doubleweave这个滤镜的参数选项ffmpeg -h filter=doubleweaveffmpeg -h filter=weave官网对这两个滤镜的解释:也就是说doubleweave在奇场和偶场帧交织后,视频的帧率不变,但weave就会减半.https://ffmpeg.org/ffmpeg-all.html#Video-Filters以下命令都可以播放:当执行第二个时默认first_field=top这个选项。f原创 2022-06-08 18:28:21 · 2214 阅读 · 0 评论 -
ffmpeg硬编解码 Inter QSV
硬编解码除了使用Nvidia的GPU之外,Inter的QSV也是一种不错的方案,跟Nvidia不同的是,如果希望使用ffmepg的Inter QSV编解码,需要在编译ffmepg时开启QSV的支持,即加上编译选项:–enable-libmfx。查看ffmpeg中已开启的对h264协议支持的库:ffmpeg -hide_banner -codecs | grep h264查看一下ffmpeg对Inter QSV的参数支持:使用举例:通过ffmpeg -h encoder=h264与ffmpeg -h d原创 2022-06-08 08:31:45 · 6651 阅读 · 0 评论 -
ffmpeg硬件编解码Nvidia GPU
常见的硬件编码包括Nvidia GPU与Intel QSV两种,还有一些嵌入式平台如树莓派,瑞芯微等。首先理解一下概念,Nvidia中文名英伟达是一个厂商名字,GPU则是这个厂商生产的显卡里的一个个图像处理的逻辑单元,它主要是作图片处理,但有逻辑处理的能力,所以可以替cpu分担一些逻辑处理压力。了解一下ffmpeg对Nvidia的GPU编码支持哪些参数,可以通过ffmpeg -h encoder=h264_nvenc可以看到编码的参数与x264相比有些类似,但少很多,不过关键的都在。解码时ffmpe原创 2022-06-08 08:30:43 · 3356 阅读 · 0 评论 -
ffmpeg CBR精准码流控制三个步骤
关于B帧:如果不希望出现B帧,多用B帧才能使得h264真正压缩率达到200,I帧压缩率最低,P帧中等,B帧最高,因此B帧也会增加编码器负载,但可以减少码率。与不用相比,多用B帧时,同样的码率视频更清晰。x264可以设置VBR和CBR的编码模式,VBR为可变码率,CBR为恒定码率。尽管互联网上VBR居多,但是CBR依然存在。ffmpeg是通过-b:v来指定视频码率,但这个设定的是平均值,并不能够很好的控制上下波动幅度。如果要控制波动,还需要控制最大码率和最小码率,即-b:v,maxrate,minra原创 2022-06-05 11:38:02 · 3137 阅读 · 0 评论 -
Assertion desc failed at libswscale/swscale_internal.h:674和ffmpeg的各种key+value
报错的函数:这个问题是码流探测时没有获取到足够的信息,如视频的width和height。可以根据提示增加码流探测时间,或者码流探测缓冲区大小。av_dict_set(&options, “probesize”, “2048000”, 0);//后面这个是byte,要根据流的比特率设置,码流探测时接收到的流放在这个缓冲区。av_dict_set(&options, “max_analyze_duration”, “1000000”, 0);//单位为微妙如果这两个需要设置很大才能获取到码流信息,比如5s原创 2022-06-02 18:22:25 · 1615 阅读 · 0 评论 -
av_read_frame返回值为-5 Input/output error
udp中断报错av_read_frame返回值为-5 EIO打印日志为报这个错误是因为输入流写的速度过快,av_read_frame读的过慢,导致缓冲区满了,就会报这个IO错误。原创 2022-06-01 13:14:50 · 1145 阅读 · 0 评论 -
为什么udp流设置1316字节
当我们在用udp推流时经常会看到pkt_size=1316,如下:ffmpeg -re -i westLife.mp4 -f mpegts udp://127.0.0.1:5000?pkt_size=1316上述命令中pkt_size=1316是什么意思,它是指udp发送音视频流时,每个udp包所含有的有效负载的大小。在代码中设置如下:AVDictionary*dic = NULL;av_dict_set(&dic, “pkt_size”, “1316”, 0); //Maximum UDP pa原创 2022-05-31 22:01:20 · 1196 阅读 · 0 评论 -
TestPattern error
[mpegts @ 0x7f77740027c0] PES packet size mismatch[mpegts @ 0x7f77740027c0] Packet corrupt (stream = 1, dts = 84151592).read_time:126[h264 @ 0x7f7774022c00] error while decoding MB 64 29, bytestream -6againVread_time:3[aac @ 0x7f777402e780] decode_ba原创 2022-05-26 15:00:16 · 5210 阅读 · 0 评论 -
Testpattern
//udp->deckffmpeg -i udp://127.0.0.1:6017 -max_delay 0 -preset ultrafast -tune zerolatency -threads 8 -fflags nobuffer -pix_fmt uyvy422 -ar 48000 -f decklink 88:25a7cda0:00000000//video0->udpffmpeg -framerate 25 -video_size 640x480 -max_delay 0 -t原创 2022-05-18 19:04:24 · 482 阅读 · 0 评论 -
计算1s视频的bit率
首先区分bit和byte的区别:计算机中的0101中,每一位称为一个bit把连续的8个bit称为一个byte当说网速,带宽时说的比特率是bit当说存储大小时说的是byte。有种特例,比如当我们要下载时说下载速度,说的是byte,因为这个跟存储相关。当我们直播,推拉流时说的都是bit,用每秒钟传输的bit位数来衡量流的速率大小。1080i50时,用h264编码,像素格式使用yuv420p,1s视频的流大小为:1920x1080x1.5x8x(25/100)=6220800bits转换成kb为原创 2022-05-12 10:32:50 · 366 阅读 · 0 评论 -
svn编译报错SRTO_STRICTENC
SRTO_SMOOTHER -> SRTO_CONGESTIONSRTO_STRICTENC -> SRTO_ENFORCEDENCRYPTIONSRTO_TSBPDDELAY -> SRTO_LATENCY原创 2022-04-25 12:44:09 · 212 阅读 · 0 评论 -
ffmpeg配置opus
sudo apt-get install libopus-dev配置ffmpeg–enable-libopus 表明生成ffmpeg时,使用libopus库。–enable-encoder 表明开启名字为’libopus’的编码器。./configure --enable-libx264 --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libopus --enable-encoder=libopus --extra-libs=‘原创 2022-04-10 15:38:35 · 1573 阅读 · 0 评论 -
gpu加速编码未完
Ubuntu 16.04 上 CUDA_10.0及cuDNN的安装:https://blog.csdn.net/lihe4151021/article/details/90237681?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164514827616780274118633%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&reque原创 2022-03-21 10:42:49 · 195 阅读 · 0 评论 -
使用i9-9880H测试h264/265编解码开销
编解码方式:h264几路:一路编码一路解码是否都在本机:是WxH帧率:1920x1080码率:10Mid:90cpu:Intel® Core™ i9-9880H CPU @ 2.30GHz 8核16线程流媒体类型:sls流协议:srt复用方式:mpegts服务器和推拉流端部署在同一个计算机吗:对视频质量:佳音频质量:无每个核是否负载均衡:16个线程有一个线程50-60左右,应该是ffplay或者sls的线程视频三元组:yuv420p,25帧音频帧率是否有丢:25帧稳定音频三元原创 2022-02-16 16:30:25 · 837 阅读 · 0 评论 -
播放器实战--音视频同步方案
PTS:Presentation timestamp 最终渲染时用的时间戳DTS:Decoding timestamp 解码用 的什么有I(intra) B(bidirectional) P(predicted)压缩原理,帧内压缩 gop 第一帧是关键帧 B帧可以向前向后参考一帧,也可以多少帧,一般设置为3帧。只有有B帧时,pts和dts才不一样。从哪获得pts呢,从解复用的流中的AVPacket中有pts,解码后的AVFrame中也有pts。两个地方的值相同,特殊时候AVFrame中没有pts,但是原创 2022-02-11 22:19:09 · 2245 阅读 · 0 评论 -
swr_convert和sws_scale转换时会拷贝哪些值
int len = 0;len_swr = swr_convert(asc, frame_48000->data, frame_48000->nb_samples,(const uint8_t **)frame_v->data, frame_v->nb_samples);int re = 0;re = sws_scale(swsc, frame_v->data, frame_v->linesize, 0, decodec_ctx_v->height, uvy原创 2022-02-09 11:39:21 · 1471 阅读 · 0 评论 -
屏幕为黑色yuv值怎么设置
上篇文章讲了静默认的时候pcm值怎么设置,这篇讲讲屏幕是黑屏时,yuv值怎么设置。当我们想让yuv设置为一个颜色的时候,我们往往先关注对应的rgb值,因为rgb值比较常用,三原色组成各种颜色的原理更易理解。找到对应的rgb值然后再转换为yuv值。 白色:rgb(255,255,255) 黑色:rgb(0,0,0) 红色:rgb(255,0,0) 绿色:rgb(0,255,0) 蓝色:rgb(0,0,255) 青色:rgb(0,255,255) 紫色:rgb(255原创 2022-01-25 15:58:35 · 5003 阅读 · 0 评论 -
如何设置pcm值为静默音
在音视频领域,设置pcm为静音的值也叫作脏数据。首先需要知道pcm是时域信号,有震动才有声音,也就是有值的变化才有声音,因此只要设置相同的值后,就是静默音。(编码会时频转换)编者实测位深16位,2通道,每个字节全设置为1或者0,都是静默音。一般设置为0。设置为0的方式:char silenceBuf[1120*2*2] = {0};每个字节设置为1的方式:char silenceBuf[1120*2*2] = {0};memset(silenceBuf, 1, sizeof(silence原创 2022-01-25 13:48:12 · 2493 阅读 · 0 评论