草上爬
专注技术,热爱分享
展开
-
基于FFmpeg的视频播放器之十六:完结
学习FFmpeg个人认为是不需要买书的,只需利用好下面四种资源1.优秀的博客,比如雷神的博客:https://blog.youkuaiyun.com/leixiaohua10202.FFmppeg的exanmples:FFmpeg: Examples3.优秀的开源播放器,比如VLC、MPlayer、MVP、QtAV等4.FFmpeg的源码当然最重要的是自己要尝试用FFmpeg去做一个基本功能完整的播放器,以做带学。如果身边有老鸟、大神相助就再好不过了。博主本人喜欢听歌,播放器做好后,就试了试mp3和wav,原创 2022-05-26 17:41:00 · 3559 阅读 · 13 评论 -
基于FFmpeg的视频播放器之十五:录像
一.效果二.原理将上一篇基于FFmpeg的视频播放器之十四:remuxing中的代码直接用于录像是行不通的,会存在下列问题1.因为可以从任意时间点开始录制,此时第一帧的时间戳就不是0了,虽然也可以生成视频文件,但是经测试该视频文件爱奇艺客户端可以正常播放,PotPlayer和windows自带的播放器都不能正常播放解决方法是让录制的第一帧时间戳从0开始,这里以视频为例,音频同理:int64_t m_firstVideoPts=0int64_t m_firstVideoDts=0vo.原创 2022-05-25 15:12:47 · 3760 阅读 · 5 评论 -
基于FFmpeg的视频播放器之十四:remuxing
录像实际上就是remuxing的过程,因此本篇是下一篇——基于FFmpeg的视频播放器之十五:录像的理论部分最权威的参考当然来自FFmpeg的examples:https://ffmpeg.org/doxygen/trunk/examples.html,remuxing.c这个例子不做转码,比如改变分辨率、帧率、编码方式等,而且是将整个视频文件从头到尾转存,代码不到200行,学习起来还是比较容易的个人觉得有两个地方需要注意一下:一.av_packet_rescale_ts这个函数用于转封装过程原创 2022-05-25 11:13:47 · 3623 阅读 · 1 评论 -
基于FFmpeg的视频播放器之十三:抓图
抓图的话当然可以用QImage来实现,但是得先把yuv图像转成图像再通过QImage保持,比较麻烦。这里直接通过ffmpeg从视频流中抓取图片,也就是在yuv渲染之前抓取。这里文件名使用当前时间,因此只需要传入图片保持的路径就行,filePath就是传入的路径 time_t tt = time(nullptr); struct tm *_time = localtime(&tt); char szTime[64] = {0}; strftime(szTime, ...原创 2022-05-19 20:25:19 · 4075 阅读 · 2 评论 -
基于FFmpeg的视频播放器之十二:seek
seek是播放器的常用操作,也是衡量播放器好坏的重要标志之一。一.效果下面是对正在播放的4K视频执行seek操作原创 2022-05-17 22:07:53 · 5155 阅读 · 3 评论 -
基于FFmpeg的视频播放器之十一:倍速播放
倍速播放通常有两种方式:一种是变速变调,另一种是变速不变调一.变速变调这种方法的原理就是音频重采样。比如说44100Hz采样率的音频,每秒钟有44100个采样点,如果我们要加速为200%播放,最简单的方法是将解码出来的音频数据,均匀的扔掉一部分即可。解码出来44100个采样点,本来可以播放1s的时长,我扔掉一半,那么我们就只剩下 22050 个采样点,仍然按照 44100 的采样率去播放,那么我们就只能播放0.5s的时长,这样音频的播放速率就变为了200%。如果原始采样率为44100Hz,播放速度原创 2022-05-17 15:59:26 · 5489 阅读 · 4 评论 -
基于FFmpeg的视频播放器之十:音视频同步
一.时间戳与时间基1.DTS 和 PTSDTS(Decoding Time Stamp, 解码时间戳),表示压缩帧的解码时间。PTS(Presentation Time Stamp, 显示时间戳),表示将压缩帧解码后得到的原始帧的显示时间。音频中DTS和PTS是相同的。视频中由于B帧需要双向预测,B帧依赖于其前和其后的帧,因此含B帧的视频解码顺序与显示顺序不同,即 DTS 与 PTS 不同。当然,不含B帧的视频,其DTS和PTS是相同的。下图以一个开放式GOP示意图为例,说明视频流的解码顺序..原创 2022-05-17 14:45:57 · 3671 阅读 · 1 评论 -
基于FFmpeg的视频播放器之九:使用SDL2播放音频
一.pcm文件准备找一个mp3文件,然后用FFmpeg命令将它转换成pcm文件,这里使用NorwayForest-500.mp3(挪威的森林-伍佰)。首先要使用ffmpeg查看mp3文件的一些信息,比如采样率、声道数等。ffmpeg -i NorwayForest-500.mp3从上图所示的信息,可以看到mp3文件采样率是44100Hz,双声道,在转换成pcm文件时要用到上面的信息。ffmpeg -i NorwayForest-500.mp3 -acodec pcm_s16le -f原创 2022-05-02 22:45:09 · 4786 阅读 · 1 评论 -
基于FFmpeg的视频播放器之八:音频重采样
一.什么是音频重采样音频重采样就是改变音频的采样率、采样格式、声道数等参数,使之按照我们期望的参数输出。比如我们将采样率 48kHz、采样格式 f32le、声道数 1 的音频 A 转换成采样率 44.1kHz、采样格式 s16le、声道数 2 的音频 B。那么为什么需要对音频重采样?列举一个经典用途,有些音频编码器对输入的原始PCM数据是有特定参数要求的,比如要求必须是44100_s16le_2。但是你提供的PCM参数可能是48000_f32le_1。这个时候就需要先将48000_f32le_1转换成原创 2022-05-02 22:33:27 · 4887 阅读 · 1 评论 -
基于FFmpeg的视频播放器之七:音频解码
一.流程音频解码的流程和视频解码几乎一样,最大的区别是解码后需要进行重采样。因为解码出的AVSampleFormat是AV_SAMPLE_FMT_FLTP(float, planar),该格式无法直接使用SDL进行播放,需要转换成SDL支持的AV_SAMPLE_FMT_S16(signed 16 bits)格式。关于重采样,详见下篇博客。1.avcodec_find_decoder提供两种方式查找解码器,通过codecId查找avcodec_find_decoder与通过名字查找avcode原创 2022-05-02 20:57:37 · 4935 阅读 · 1 评论 -
基于FFmpeg的视频播放器之六:使用QOpenGLWidget渲染yuv420p
一.GLSL VersionsIntroYou can use the#versioncommand as the first line of your shader to specify GLSL version:#version 120void main() { gl_FragColor = vec4(1.0);}GLSL versions are released alongside GL versions. See the following charts to...原创 2022-05-01 14:47:25 · 3846 阅读 · 2 评论 -
基于FFmpeg的视频播放器之五:使用SDL2渲染yuv420p
一.yuv文件准备找到一个mp4文件,然后用FFmpeg命令将它转换成yuv文件,这里使用一个野生动物视频Wildlife.mp4。首先要使用ffmpeg查看mp4文件的一些信息,比如编码器类型、像素格式、分辨率、帧率等。ffmpeg -i Wildlife.mp4从上图所示的信息,可以看到像素格式是yuv420p、分辨率是1280x720、帧率是29.97,所以这里直接转换成yuv文件即可,不需要添加转换像素格式的参数。ffmpeg -i Wildlife.mp4 Wildli.原创 2022-05-01 14:42:50 · 3799 阅读 · 1 评论 -
基于FFmpeg的视频播放器之四:视频解码
一.流程1.avcodec_find_decoder提供两种方式查找解码器,通过codecId查找avcodec_find_decoder与通过名字查找avcodec_find_decoder_by_name,这里使用的是AVCodec *avcodec_find_decoder(enum AVCodecID id)这个ID号从哪里获取呢?就像之前我们解封装之后,可以发现我们的AVStream里面其实是有一个codecID, 那个ID号就是我们要用到的解码器的ID号。当然如果本身知道格式的..原创 2022-04-30 20:00:05 · 4013 阅读 · 1 评论 -
基于FFmpeg的视频播放器之三:拉取rtsp流
拉取网络流和打开本地文件流程差不多,详见:基于FFmpeg的视频播放器之二:解复用,下面是不同地方。一.准备一个可用的rtsp流方法有很多,最方便的应该是用VLC串流了,具体步骤如下:https://blog.youkuaiyun.com/m0_61353061/article/details/120388230当然也可以使用live555作为rtsp服务器,可参考:https://blog.youkuaiyun.com/zhiyuan2021/article/details/117735299二.初始化网络功能原创 2022-04-29 12:48:09 · 6929 阅读 · 1 评论 -
基于FFmpeg的视频播放器之二:解复用
一.流程解复用就是读取本地文件或网络流,将解封装后的音频和视频数据分别保存到缓存队列中解复用的一般流程如下:1.avformat_open_inputint avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);该函数的作用就是打开文件,尽可能的收集各方面的信息并填充AVFormatContext结构体,基本上是做了除过解码之外的所有工作这原创 2022-04-29 00:06:47 · 4492 阅读 · 3 评论 -
基于FFmpeg的视频播放器之一:开篇
FFmpeg的研究几乎都是从ffplay开始的,ffplay是FFmpeg自带播放器,它的源码虽然只有一个文件,但是麻雀虽小五脏俱全,播放器的基本功能都有了。初看ffplay的源码,会感觉特别绕,跳转比较多。深入其中之后,就可以稍作修改封装,并添加UI,就可以实现自己播放器了。关于ffplay的源码分析,可以参考博客:https://zhuanlan.zhihu.com/p/44694286https://www.cnblogs.com/leisure_chn/p/10301215.html...原创 2022-04-27 17:57:39 · 6386 阅读 · 2 评论