在ffmpeg的官网下载的dev目录中,有一个转码器的程序,具体目录为\ffmpeg-3.2.2-win32-dev\doc\examples\transcoding.c,稍微修改,即可在visual studio中编译运行,可参考我的资源,ffmpeg官网转码vs可编译。
依赖的库: avcodec.lib avdevice.lib avfilter.lib avformat.lib avutil.lib postproc.lib swresample.lib swscale.lib
头文件目录: ~\ffmpeg-3.2.2-win32-dev\include
参数格式:in.h264 out.h264默认输入尺寸随意,输出转码为720x480大小。
在源码中,输入部分接口为:
avformat_open_input(&ifmt_ctx, filename, NULL, NULL))
其中filename可以为命名管道的形式,即avformat_open_input(&ifmt_ctx, "\\\\.\\pipe\\MyNamedPipe", NULL, NULL)),这样即可进行ffmpeg多进程之间h264的码流通信。
比如,ffmpeg接受网络流,通常用sdp作为输入,而sdp对于接受缓冲,延迟,抖动的设置均不灵活。而采用命名管道的方式,可以独立写一个接受网络h264流的程序,通过WriteFile调用命名管道的写如完成h264的码流通信。
进程间通信也可以采用共享内存的方式,不过共享内存需要注意进程间的h264帧队列的同步,而实测效果对于1080P,60帧的码流,性能相当。
在linux下,pipebuf为4k,pipe为16条,所以pipesize最大为16*4k即65536个bytes,按帧传输h264码流,有一定风险,尚不明确如何像windows那样,指定pipe的缓存大小。