
ffmpeg
文章平均质量分 77
lxkj_2024
吾尝终日而思矣,不如须臾之所学也
展开
-
使用线程局部存储解决ffmpeg中多实例调用下自定义日志回调问题
这里我们发现av_dump_format是在process函数中调用的,他们一定属于同一个线程,所以可以通过定义一个全局的线程局部变量,并在process函数开始设置为当前调用的上下文,之后就可以在av_dump_format的日志回调中使用这个线程局部变量来获取当前调用的上下文,这样就实现了区分多实例的目的。为了获得av_dump_format的日志输出,我们首先使用av_log_set_callback来对ffmpeg里面的日志进行接管,但是av_dump_format里面打印日志时无法传递任何标识。原创 2024-11-20 16:45:10 · 457 阅读 · 0 评论 -
修改ffmpeg实现https-flv内容加密
参考了阿里云直播加密方案后我们的内容加密架构图如上,其中播放器基于ffmpeg开发,使用的是https-flv协议,其中对称加密使用的是aes加密ctr模式,在之前进行录像加密时需要实现从任意字节任意长度进行加解密,因此之前已经封装了一套基于openssl的加解密函数(链接为),但直播内容加密是从前向后的有序流式传输,不存在seek操作,因此这个场景较为简单。https-flv的数据解密既可以放到协议层,也可以放到解封装层,经过比较还是放到协议层修改比较方便,对应的文件就是http.c。原创 2024-11-20 15:39:13 · 691 阅读 · 0 评论 -
修改ffmpeg源码为rtsps协议增加证书校验功能
鉴于安全原因,我们将之前使用ffmpeg api实现的rtsp推流修改为rtsps,因为ffmpeg本身支持rtsps,所以我们只需编译配置ffmpeg时增加-enable-openssl参数,然后使用ffmpeg api时直接将rtsp替换为rtsps即可(以及对应的端口修改,同时服务端也需要支持rtsps)。原创 2024-09-24 13:45:28 · 1021 阅读 · 0 评论 -
修改ffmpeg源码实现rtps协议(rtp over tls)
对于rtps_open,首先调用av_url_split获取协议的hostname(域名或者ip)、端口以及协议名,之后对协议名进行判断如果是rtps则表明我们要使用的底层协议是tls,因为ff_rtps_protocol的name字段是rtps,所以走到rtps_open时其协议名一定是rtps,也就是说这里的判断多此一举了,如果想同时支持TCP和TLS的话可以通过增加选项来实现。的代码,这里的更加简单,都不需要编解码,仅仅是转封装,不再描述。原创 2024-08-29 13:29:01 · 952 阅读 · 0 评论 -
记一次ffmpeg自动流选择遇到的问题
因为ffmpeg这个进程就是ffmpeg.c及相关源文件编译出来的,所以可以通过扒代码的方式来进行分析,最终通过代码调试,发现问题出在自动流选择的score计算上,具体就是AVStream的disposition上,A.mp4和B.mp4都包含两个视频流和两个音频流,但第一个音频流和第一个视频流被ffmpeg当作是默认流(也就是具有AV_DISPOSITION_DEFAULT标识),所以默认流的得分要比非默认流的得分大5000000,因此解释了上面“不合理“的地方。原创 2024-07-17 16:38:32 · 357 阅读 · 0 评论 -
使用fbdev进行屏幕图像采集
fbdev即frame buffer device,翻译为帧缓冲设备,代表了显示硬件的抽象,每个帧缓冲设备对应于一个显示屏或显示控制器。它通过/dev/fbx(如/dev/fb0)设备文件对外暴露,可以通过读写这些文件来进行图像的采集与图像的显示。原创 2024-07-10 14:43:30 · 645 阅读 · 0 评论 -
ffmpeg API实现拉取rtsp流存储为图片
在avformat_open_input之后我们通常会调用avformat_find_stream_info来获取输入文件的流信息,这是因为提供的输入文件可能没有文件头或者文件头没有足够的信息,avformat_find_stream_info会尝试解码来获取更多的信息。和解码一样,新版本的ffmpeg使用avcodec_send_frame和avcodec_receive_packet来代替旧的编码接口avcodec_encode_video2来进行编码,其用法也和解码一样。原创 2024-06-26 15:14:58 · 3271 阅读 · 0 评论 -
ffmpeg可执行程序裁剪
最近我们在嵌入式板子上有一个需求,拉取网络摄像头的rtsp流保存为jpg/png图片,我们准备借助ffmpeg命令行工具去完成,命令行实现这个功能很简单,但是编译出的ffmpeg可执行程序的大小很大,因此我们尝试对ffmpeg可执行程序进行编译裁剪,最终我们发现按照下面方法后进行裁剪后的大小只有之前的1/4不到,解决了我们遇到的问题。原创 2024-05-29 15:28:17 · 1739 阅读 · 0 评论 -
ffmpeg进程优雅退出
有时我们会在程序中通过fork/execl方式调用ffmpeg进程执行某些命令,这通常比调用API更简单。然后我们等待这些命令执行完毕后ffmpeg进程自动就会结束,但如果我们的任务是需要长时间运行比如拉取rtsp流保存为mp4,我们希望这个工作可以随时终止,终止的时候ffmpeg要优雅的退出,即ffmpeg要可以在退出时执行写入mp4的元数据、正常关闭文件等清理工作,使他看起来就像是正常退出一样,ffmpeg可以吗?原创 2024-05-23 17:02:15 · 1680 阅读 · 1 评论