Akagi201
1/10/2015 - 12:41 PM

ffmpeg-librtmp.md

librtmp 源码分析

FFMpeg处理RTMP流有两种方式: 一个是使用自带的RTMP代码功能; 一个是使用第三方库librtmp; 下面就这两种方式的一些使用和差异做了个总结;

一、自带RTMP代码功能 FFmpeg自带的RTMP代码只支持RTMP协议,不支持rtmpt,rtmpe,rtmpte和rtmps协议; 命令行设置如下:

  1. 将RTMP流原样保存成文件

./ffmpeg -i rtmp://192.168.1.11:1935/live/teststream -acodec copy -vcodec copy -f flv -y test.flv

  1. 将RTMP流转码保存成文件

./ffmpeg -i rtmp://192.168.1.11:1935/live/teststream -acodec ... -vcodec ... -f mp4 -y test.mp4

  1. 将RTMP流转码后再以RTMP流的方式推送到RTMP流服务器

./ffmpeg -i rtmp://192.168.1.11:1935/live/teststream -acodec ... -vcodec ... -f flv rtmp://10.2.11.111/live/newstream

NOTE: FFMpeg自带RTMP代码只支持RTMP流格式如: rtmp://server:port/app/stream_name (eg: rtmp://192.168.1.11:80/live/test) 不支持RTMP流格式如: rtmp://192.168.1.11:80/live/app/test 要想支持这种格式的RTMP流,就需要更专业和强大的每三方库librtmp;

二、第三方库librtmp 如何让FFMpeg链接该库可以参见文章: http://blog.csdn.net/fireroll/article/details/8607955

这样FFMpeg就可以支持rtmp://, rtmpt://, rtmpe://, rtmpte://,以及 rtmps://协议了。 链接了librtmp的FFMpeg接受一个字符串的输入方式, 如:"rtmp://server:port/app/playpath/stream_name live=1 playpath=xxx ..." NOTE:引号是必须的;

  1. 保存RTMP直播流原样保存成文件:

./ffmpeg -i "rtmp://pub1.guoshi.com/live/newcetv1 live=1" -vcodec copy -acodec copy -y cetv1.flv

  1. 将RTMP流转码后再以RTMP流的方式推送到RTMP流服务器

./ffmpeg -i "rtmp://192.168.1.11:1935/live/app/teststream live=1" -acodec ... -vcodec ... -f flv rtmp://10.2.11.111/live/newstream

  1. 用ffplay播放RTMP直播流: ffplay "rtmp://pub1.guoshi.com/live/newcetv1 live=1"

  2. 在使用FFMPEG类库进行编程的时候,也是一样的, 只需要将字符串传递给avformat_open_input()就行了,形如: ffplay "rtmp://pub1.guoshi.com/live/newcetv1 live=1"

char url[]="rtmp://live.hkstv.hk.lxdns.com/live/hks live=1";
avformat_open_input(&pFormatCtx,url,NULL,&avdic)