编码:设置好编码时的codecContext,然后一帧一帧的往ffmpeg里面塞就行了,ffmpeg的强大性是毋庸置疑的,如果例子的ffmpeg工程里面的APIexample里面有,很容易编译过去。注:编码ffmpeg默认编译的时候是没有H264的,因此需要将X264的链接到ffmpeg中,编译命令也要修改一下。
解码:如果解码本地的文件的话,教程一大堆,不过要是想用APIexample中的方法去解码是不行的,很多时候只能跳着解出几帧,而且还是花的,本人尝试着自己去解包264然后将一帧数据送给avcodec_decode_video去解码,失败,错误有时返回-1,有时解出的图像就是全黑。猜测是因为没有初始化好结构AVcodecContext,打开文件的时候可以通过AVFormatContext去初始化好,AV_file_open中ffmpeg读取了头信息,并打开文件等等操作,尝试着去跟代码,不过由于对其结构不是很清楚所以找不明白。
网络串流的打开:曾将尝试自己写socket接受流送给ffmpeg,多种尝试都告失败;其实ffmpeg可以直接打开URL,TCP传输的直接用http://IP:port格式,UDP据说是 udp://ip?localport=prot的格式,ffmpeg太高深了,文档又没有,只能靠肯代码自己理解了。
另外链接ffmpeg动态库的时候VC设置成__cdecl (/Gd),std的有2019链接错误。
This is the default calling convention for C and C++ programs. Because the stack is cleaned up by the caller, it can do vararg functions. The __cdecl calling convention creates larger executables than __stdcall, because it requires each function call to include stack cleanup code. The following list shows the implementation of this calling convention.
Name-decoration convention | Underscore character (_) is prefixed to names, except when exporting __cdecl functions that use C linkage. |
c link产生的DLL用c的方式去调用。