课程名称:音视频基础+ffmpeg原理 入门音视频技术开发
课程章节:音视频环境基础
课程讲师:李超
课程内容
1.音视频的应用
- 互动直播系统,比如:在线教育,音视频会议,特点是交互性强;
- 娱乐直播系统,比如:电视系统,斗鱼,特点是现场和互动直播系统开始融合;
- 音视频特效,比如:美颜,变声等;
- 音视编辑,比如:视频编辑,爱剪辑等;
- 其他:比如:监控系统。
2.娱乐直播系统
这一讲介绍了简单的娱乐直播系统的实现,在开始之前,需要先了解一些前置知识。
- ffmpeg 是用于推流到流媒体服务器的;
- ffplay 是用于从流媒体服务器通过 rtmp 取流并播放的;
- vlc 也可以从 rtmp 地址取流并播放的,而且还可以进行暂停等 ffplay 没有的操作。
实现简单的直播演示大概需要经过以下几个步骤:
- 首先要有一个流媒体服务器,用来将音视频流推到流媒体服务器上。
ffmpeg -i ~/Documents/new_killer.mp4 -f flv rtmp://localhost/live/test
- 另外还需要客户端从流媒体服务器上拉取流,并播放出来。
ffplay rtmp://localhost/live/test
- 先执行拉取流的指令,再执行推流的指令
- 还可以使用ffplay 直接播放视频。
ffplay ~/Documents/new_keller.mp4
也可以直接使用vlc播放,vlc播放器有播放暂停等按钮,ffplay中没有这些。
3.遗留两个问题及解决
在实现直播演示时,遇到了两个问题:
1.推流失败
分析推流失败的报错信息:时长不对,没有正确的文件大小,最主要的原因是时间戳出了问题。播放时默认采用最快的优先级方式,ffmpeg将音频和视频分开,按最快的方式进行推流,音视频就很难进行同步了。比如放音频的时候,发现和视频流的时间戳不匹配,就报错了。解决办法加上 -re 参数:让音视频按照原来的速度进行播放(同步)
ffmpeg -i ~/Documents/new_killer.mp4 -f flv rtmp://localhost/live/test
补充 ffmpeg re 参数
-re (input)
Read input at native frame rate. This is equivalent to setting -readrate
以原始帧率的方式读取,等价于设置:readrate = 1,不设置该参数则以尽量快的方式推流,导致音视频不同步。
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
Select an encoder (when used before an output file) or a decoder (when used before an input file)
for one or more streams. codec is the name of a decoder/encoder or a special value copy
(output only) to indicate that the stream is not to be re-encoded。
选择编码器,copy表示无需进行编码。不设置-c copy 则默认对mp4进行重新编码成flv,重新编码会导致视频清晰度下降。
2.清晰度不高
当通过 -f flv 的方式的时候,将会mp4 重新编码,将导致视频质量损失,如果想不损失,就加上参数 -c copy,完全采用之前的视频清晰度。-c:v copy, 只拷贝视频的格式,不考虑音频。
ffmpeg -re -i ~/Documents/new_killer.mp4 -c:v copy -f flv rtmp://localhost/live/test