您当前的位置:首页 > 电脑百科 > 软件技术 > 音/视频编辑

ffmpeg解码处理

时间:2020-08-08 12:08:11  来源:  作者:

一、前言

采用ffmpeg解码,是所有视频监控开发人员必备的技能,绕不过去的一个玩意,甚至可以说是所有音视频开发人员的必备技能。FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在 linux 下开发出来的,但它可以在包括 windows 在内的大多数操作系统中编译。这个项目是由 Fabrice Bellard 发起的,现在由 Michael Niedermayer 主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。

关于ffmpeg解码,网上搜索到的代码绝对是一大堆一大堆,而且很多都讲得很详细,解码的函数流程图非常清晰,关于ffmpeg这块的学习本人推荐雷神的博客,分析的相当细致,我在很久以前刚用Qt+ffmpeg解码的时候,参考的就是雷神的例子,当然这些demo其实在ffmpeg的开发包dev下的examples也是非常详细的,只不过没有什么分析过程,参考雷神的博客可以看到很多分析过程。

本人总结的解码过程:

1. 注册解码库相关(av_register_all、avformat_network_init等)

2. 初始化各种参数比如缓存大小等(av_dict_set)

3. 打开视频流或者文件(avformat_alloc_context、avformat_open_input)

4. 获取流信息(avformat_find_stream_info)

5. 获取视频流并初始化视频解码器(av_find_best_stream、avcodec_find_decoder)

6. 获取音频流并初始化音频解码器(av_find_best_stream、avcodec_find_decoder、avcodec_open2)

7. 预分配帧内存(av_frame_alloc)

8. 循环读取音视频帧(av_read_frame、av_packet_unref)

9. 解码视频(avcodec_decode_video2或者avcodec_send_packet、avcodec_receive_frame)

10. 解码音频(avcodec_decode_audio4)

11. 处理结束释放资源(sws_freeContext、av_frame_free、av_free)

## 二、功能特点

1. 多线程实时播放视频流+本地视频+USB摄像头等。

2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。

3. 多线程显示图像,不卡主界面。

4. 自动重连网络摄像头。

5. 可设置边框大小即偏移量和边框颜色。

6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。

7. 可设置两种OSD位置和风格。

8. 可设置是否保存到文件以及文件名。

9. 可直接拖曳文件到ffmpegwidget控件播放。

10. 支持h265视频流+rtmp等常见视频流。

11. 可暂停播放和继续播放。

12. 支持回调模式和句柄两种模式。

13. 支持线程读取进度等信息和事件回调两种处理模式。

14. 自动将当前播放位置和音量大小是否静音以信号发出去。

15. 提供接口设置播放位置和音量及设置静音。

16. 支持存储单个视频文件和定时存储视频文件。

17. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。

18. 支持qsv、dxva2、d3d11va等硬解码。

19. 支持opengl绘制视频数据,极低CPU占用。

20. 支持嵌入式linux。

## 三、效果图

 

Qt音视频开发6-ffmpeg解码处理

 

 

## 四、相关站点

1. 国内站点:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)

2. 国际站点:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

3. 个人主页:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)

4. 知乎主页:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)

5. 体验地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)

## 五、核心代码

bool FFmpegThread::init()
{    //判断该摄像机是否能联通    if (checkConn && isRtsp) {
        if (!checkUrl(url, checkTime)) {
            return false;
        }    }    //初始化参数    this->initOption();    //初始化输入    if (!initInput()) {
        return false;
    }    //初始化视频    if (!initVideo()) {
        return false;
    }    //初始化音频    if (!initAudio()) {
        return false;
    }    //初始化帧    this->initFrame();    //输出视频信息    //av_dump_format(formatCtx, 0, url.toStdString().data(), 0);
    //qDebug() << TIMEMS << "init ffmpeg finsh";
    return true;
}void FFmpegThread::initOption(){    //在打开码流前指定各种参数比如:探测时间/超时时间/最大延时等    //设置缓存大小,1080p可将值调大
    av_dict_set(&options, "buffer_size", "8192000", 0);
    //以tcp方式打开,如果以udp方式打开将tcp替换为udp    av_dict_set(&options, "rtsp_transport", transport.toLatin1().constData(), 0);
    //设置超时断开连接时间,单位微秒,3000000表示3秒
    av_dict_set(&options, "stimeout", "3000000", 0);
    //设置最大时延,单位微秒,1000000表示1秒
    av_dict_set(&options, "max_delay", "1000000", 0);
    //自动开启线程数    av_dict_set(&options, "threads", "auto", 0);
    //设置USB摄像机分辨率    if (url.startsWith("video")) {
        QString size = QString("%1x%2").arg(videoWidth).arg(videoHeight);
        av_dict_set(&options, "video_size", size.toLatin1().constData(), 0);
    }}bool FFmpegThread::initInput(){    //实例化格式处理上下文    formatCtx = avformat_alloc_context();    //先判断是否是本地设备(video=设备名字符串),打开的方式不一样    int result = -1;
    if (url.startsWith("video")) {
#if defined(Q_OS_WIN)
        AVInputFormat *ifmt = av_find_input_format("dshow");
#elif defined(Q_OS_LINUX)        AVInputFormat *ifmt = av_find_input_format("video4linux2");
#elif defined(Q_OS_MAC)        AVInputFormat *ifmt = av_find_input_format("avfoundation");
#endif        result = avformat_open_input(&formatCtx, url.toStdString().data(), ifmt, &options);    } else {
        result = avformat_open_input(&formatCtx, url.toStdString().data(), NULL, &options);    }    if (result < 0) {
        qDebug() << TIMEMS << "open input error" << url;
        return false;
    }    //释放设置参数    if (options != NULL) {
        av_dict_free(&options);    }    //获取流信息    result = avformat_find_stream_info(formatCtx, NULL);    if (result < 0) {
        qDebug() << TIMEMS << "find stream info error";
        return false;
    }    return true;
}


Tags:ffmpeg   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
FFmpeg的作用: FFmpeg是一个优秀的多媒体框架; FFmpeg可以运行在Linux,Mac,Windows等平台; FFmpeg可以解码,编码,转码,复用,解复用,过滤音视频数据。播放器基本架构:image.pngSDL视频渲...【详细内容】
2021-10-27  Tags: ffmpeg  点击:(30)  评论:(0)  加入收藏
ffmpeg 常用基本命令资料推荐【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发-学习视频教程-腾讯课堂1.分离视频音频流ffmpeg -i input_file -vcodec copy -an...【详细内容】
2021-10-15  Tags: ffmpeg  点击:(52)  评论:(0)  加入收藏
一、FFmpeg视频解码器1.视频解码知识1).纯净的视频解码流程压缩编码数据->像素数据。例如解码H.264,就是“H.264码流->YUV”。2).一般的视频解码流程视频码流一般存储在一定...【详细内容】
2021-05-19  Tags: ffmpeg  点击:(163)  评论:(0)  加入收藏
1.前言当我们在在看腾讯视频或者其他网页上的视频时,浏览器会先缓冲ts文件到你本地.如果你想把这些ts转成mp4文件保存在本地,可以使用ffmpeg进行格式转换。准备需要合成mp4而...【详细内容】
2021-04-25  Tags: ffmpeg  点击:(440)  评论:(0)  加入收藏
在实际工作中,通常需要ffmpeg作为工具来验证一个问题,比如播放一个视频,提取一个码流,转码视频,转封格式等,用的时候才发现忘记了相关命令,Google一番花老大的力气才找到自己需要的...【详细内容】
2020-09-27  Tags: ffmpeg  点击:(74)  评论:(0)  加入收藏
1.环境搭建和整体工程说明命令行输入:-i 3.flv -vcodec copy 2_audio.mp4 转码的CPU占有率。 需要在这个目录下,拷贝正确的SDL2.dll 转码过程: 转码成功后,MP4的大小要比3.fl...【详细内容】
2020-09-24  Tags: ffmpeg  点击:(122)  评论:(0)  加入收藏
1.框架分析 ffplay.c是FFmpeg源码⾃带的播放器,调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。例如哔哩哔哩著名开源项⽬ijkplayer也是基于ffplay.c进⾏⼆次开发。ffplay实...【详细内容】
2020-09-09  Tags: ffmpeg  点击:(99)  评论:(0)  加入收藏
一、前言采用ffmpeg解码,是所有视频监控开发人员必备的技能,绕不过去的一个玩意,甚至可以说是所有音视频开发人员的必备技能。FFmpeg是一套可以用来记录、转换数字音频、视频,并...【详细内容】
2020-08-08  Tags: ffmpeg  点击:(94)  评论:(0)  加入收藏
Linux安装操作系统:CentOS7 ffmpeg版本:3.4.1安装先访问ffmpeg官网下载linux安装包 http://ffmpeg.org/download.html ,这里我下载的是官方已经编译过的版本,别问我为啥不自己编...【详细内容】
2020-06-24  Tags: ffmpeg  点击:(96)  评论:(0)  加入收藏
安装ffmpeg:下载FFmpeg和libx264的包ffmpeg-2.4.1.tar.bz2 last_x264.tar.bz2libx264需要yasm,所以先安装yasm apt-get install yasm然后安装libx264 aptitude install libx...【详细内容】
2020-05-18  Tags: ffmpeg  点击:(45)  评论:(0)  加入收藏
▌简易百科推荐
今天还真是有点小激动啊,B站看来要和抖音杠上了,之前抖音推出网页端要对标B站,不过似乎大家没有用网页刷抖音的习惯。但是这次B站竟然推出了“必剪”电脑客户端,激动的我赶紧下...【详细内容】
2021-12-14  最佳应用    Tags:剪辑   点击:(20)  评论:(0)  加入收藏
做短视频的话我们需不需要跟着热点走呢?答案当然是肯定的!而且还是一定要的!为什么呢?因为热点是最大的流量池,比如最近的大S离婚事件就是热点,这是最大的流量池。所有人的目光都...【详细内容】
2021-12-01  易撰    Tags:短视频   点击:(24)  评论:(0)  加入收藏
平时工作的时候想必大家都有听音乐(摸鱼)的视频,音乐给我们的生活带来了很大的乐趣,但是很多时候我们会发现一些格式的限制,无法播放我们用各种工具录制的音乐,我们现在就来对音频...【详细内容】
2021-11-16  下科技小助手    Tags:MP3   点击:(26)  评论:(0)  加入收藏
游戏视频录制,用什么软件录屏好?小关这几周在某鱼看到了好多的游戏主播,这些游戏主播有的比技术,有的比能说会道,有的比样貌。都在各自得直播间里面玩得热火朝天,有自己的一处小天...【详细内容】
2021-11-11  杨姐爱智能    Tags:录屏   点击:(35)  评论:(0)  加入收藏
怎么在电脑上录制高清视频?小米最近在学校有点闲,因为这个学期的课程较少,自己也提前完成了许多的学习任务,想着怎么有效的把这些空闲的时间好好利用起来,不能白白浪费这些时间吧...【详细内容】
2021-11-11  张哥聊科技    Tags:高清视频   点击:(22)  评论:(0)  加入收藏
时长:4h 14m | 32节| 视频:1280&times;720,44 KHz | 2.6 GB语言:英语+中英文字幕(根据原英文字幕机译更准确)成为Adobe Premiere Pro专业版视频编辑专家的唯一要求你会学到什么a...【详细内容】
2021-11-03  CG达人  搜狐号  Tags:Premiere   点击:(23)  评论:(0)  加入收藏
我们在制作短视频的时候,需要自己给视频配音,然后与拍摄内容合成还是很难的,所以少不了后期配音的环节。今天小编给大家推荐几款,超好用的短视频配音软件。1、剪映小伙伴是不是...【详细内容】
2021-11-03  语音dub爱好者  搜狐号  Tags:视频配音   点击:(65)  评论:(0)  加入收藏
视频怎么压缩变小?视频的出现虽然说给我们的日常生活带来了极大的消遣与事业发展,但是不得不说视频格式非常占用内存,如果想要进行视频的拍摄、剪辑、放映对工具都需要较高的要...【详细内容】
2021-11-03  娱乐情怀    Tags:视频   点击:(44)  评论:(0)  加入收藏
如何把m4v转换成mp4格式?M4V是一种应用于网络视频点播网站和移动手持设备的视频格式,是MP4格式的一种特殊类型。由苹果公司创造,此种格式为 iPod 、iPhone 和 PlayStation Port...【详细内容】
2021-11-03  纸折兔    Tags:m4v   点击:(38)  评论:(0)  加入收藏
FFmpeg的作用: FFmpeg是一个优秀的多媒体框架; FFmpeg可以运行在Linux,Mac,Windows等平台; FFmpeg可以解码,编码,转码,复用,解复用,过滤音视频数据。播放器基本架构:image.pngSDL视频渲...【详细内容】
2021-10-27  linux音视频    Tags:FFmpeg   点击:(30)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条