免费合同模板网站,怎么开店铺,苏州网站公司排名前十,网站开发背景绪论之前我们做一个视频点播的功能#xff0c;大概的流程就是将上传上来的各种格式的视频#xff0c;用FFmpeg统一进行一次转码#xff0c;如果probe到视频的编码格式是H.264就调用-vcodec copy#xff0c;如果probe到视频的编码格式不是H.264就调用-vcodec libx264#xff0c…之前我们做一个视频点播的功能大概的流程就是将上传上来的各种格式的视频用FFmpeg统一进行一次转码如果probe到视频的编码格式是H.264就调用-vcodec copy如果probe到视频的编码格式不是H.264就调用-vcodec libx264音频就统一调用 -acodec aac这样客户端每上传一个新的视频文件服务端就调用ffmpeg.exe或者ffmpeg可执行文件执行一次ffmpeg.exe -i xxx.avi -vcodec copy -acodec aac -f hls xxx.m3u8这样的流程这样就能很好地将各种不同格式的视频进行统一转码、存储和点播了。 功能是搞定了但是不是总感觉不够高大上程序这么写是不是感觉有点low~ 后来做EasyDSS流媒体服务器的拉转推又是差不多的需求把各种网络流格式例如RTSP/RTMP/HTTP/UDP等各种格式拉到EasyDSS再转推到RTMP服务里面形成一个本地化的流分发这就像RTMP CDN里面的边缘节点从中心节点取流分发或者像酒店视频系统里面的外部视频资源转内部视频资源分发这一套下来基本上的做法就跟上面的点播过程差不多1、把视频源从文件换成了网络流地址2、把视频HLS文件输出换成了RTMP推流输出至于里面什么各种网络流的协议适配RTMP推流协议的开发都丢给ffmpeg.exe去做每来一个“拉转推”的条目需求我们就启动一个ffmpeg.exe完成这项工作这样功能不也就完成了吗 功能又搞定了但还是感觉有点low~难道100个节目就让100个ffmpeg.exe来完成吗中间出现网络错误中断了怎么办又重启ffmpeg.exe 基于以上两个功能需求我在想ffmpeg.exe其实就是ffmpeg.c里面的main(char* parameter)方法对不对如果说我把main入口改造成一个FFMPEG对象instance接口例如instance.start(char* parameter)传进去的参数还是跟ffmpeg.exe命令后面的参数一样的只不过从原来的进程调用方式改成了接口调用方式至少进程维护比以前简单了。
就基于这种想法我们就开始改造ffmpeg.c做封装定义于是就定义了一套适合各种场景的接口流程
方法名称说明EasyAVFilter_Create创建句柄相当于创建了一个ffmpeg.exeEasyAVFilter_Release释放句柄EasyAVFilter_SetCallback设置回调函数和自定义指针回调过程中的各种媒体信息/连接信息/转码进度EasyAVFilter_AddInput添加输入参数(源地址)EasyAVFilter_AddFilter添加中间参数,如:转码兼容ffmpeg命令所有参数例如-vcodec copy -acodec aacEasyAVFilter_SetOutput设置输出参数(目标地址)EasyAVFilter_GetFilters获取所有参数review参数输入是否正确EasyAVFilter_Start开始工作EasyAVFilter_Stop停止工作
这样整个ffmpeg的调用流程就清爽了不用再去关注一大堆的avfilter、avcodec过程了而且也不用费劲维护一堆ffmpeg.exe音视频的开发难度直线下降后面我们举几个例子实战一下看看效果