[✔️]FFMpeg视频处理

简介: [✔️]FFMpeg视频处理

核心逻辑


while(av_read_frame()==0){
    // 成功读取到一帧的数据
    if(avcodec_send_packet()==0){
        // 成功发送获取数据包的请求后,需要循环接收数据包
        while(avcodec_receive_frame()==0){
            //成功接收到一帧的数据包
            // 处理一帧的音视频 
        }
    }
}


以上都是伪代码,言简意赅的说明了视频的处理流程。


av_read_frame


返回流的下一帧。此函数返回存储在文件中的内容,并且不会验证解码器有哪些有效帧。

它会分裂并为每个调用返回一个帧。不会的省略有效帧之间的无效数据,以便使解码器获得最大值可以解码的信息。


如果pkt->buf为NULL,则该数据包在下一个之前有效av_read_frame()或直到avformat_close_input()。否则,数据包无限期有效。在这两种情况下,必须使用不再需要av_packet_unref时。对于视频,数据包包含正好一帧。对于音频,如果每个帧帧具有已知的固定大小(例如PCM或ADPCM数据)。如果音频帧具有可变大小(例如MPEG音频),则它包含一帧。


pkt->pts、pkt->dts和pkt->持续时间始终设置为正确AVStream.time_base单位中的值(如果格式不能提供它们)。pkt->pts可以是AV_NOPTS_VALUE,如果视频格式具有B帧,因此如果没有,最好依赖pkt->dts解压缩有效载荷。


return 0(如果正常),在错误或文件结束时<0


avcodec_send_packet


avcodec_receive_frame


avformat_seek_file


int avformat_seek_file(
    AVFormatContext *s, // 媒体文件句柄
    // 流索引
    // 只有在 flags 包含 AVSEEK_FLAG_FRAME 的时候才是设置某个流的读取位置
    // 其他情况都是把这个流的time_base作为参考
    int stream_index, 
    int64_t min_ts, // 跳转到的最小的时间,或时间单位,或字节单位,或帧数序号(第几帧)
    int64_t ts, // 目标seek位置,单位同上,通常填INT64_MIN即可。
    int64_t max_ts, // 跳转到的最大的时间,单位同上,通常填 INT64_MAX 即可。
    // seek 方式
    // AVSEEK_FLAG_BYTE,按字节大小进行seek。
    // AVSEEK_FLAG_FRAME,按帧数大小进行seek。
    // AVSEEK_FLAG_ANY,会seek到非IDR,解码会出现马赛克、花屏现象。
    // AVSEEK_FLAG_BACKWARD,往 ts 后面找最近的IDR
    int flags);


返回值>=0成功,否则为错误码


seek之后,有时会发现read_frame的pts是0,frame竟然是起点,因为seek只能到关键帧,如果gop过长,也会导致回到起点,如果视频时长过短,也会因为gop多长导致这个问题


seek的timestrap参数的详细规则:


  • 当stream_index为-1时,会选择默认流,时间戳是以AV_TIME_BASE为基准


double sec = 1.25;//1.25秒 
int64_t timestamp = sec * AV_TIME_BASE; 
av_seek_frame(pFormatCtx,-1,timestamp,AVSEEK_FLAG_BACKWARD);


  • 当strea_index为索引流时,timestrap是packet.pts的时间戳


double sec = 1.25;
int64_t pts = sec / av_q2d(pFormatCtx->streams[vStreamIndex]->time_base);
av_seek_frame(pFormatCtx,vStreamIndex,pts,AVSEEK_FLAG_BACKWARD);


AVFrame


字段 解释
frame->pts Presentation timestamp in time_base units (time when frame should be shown to user).
可以作为帧时间的判断依据,注意单位是time_base
pkt_pts 废弃字段,同pts
pkt_dts 值来自触发此帧的packet.dts


目录
相关文章
|
2月前
|
编解码
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
《FFmpeg开发实战》书中3.4.3节讲解如何将H.264流封装成MP4。H.264流通常以SPS→PPS→IDR帧开始,这一说法通过雷霄骅的H264分析器得到验证。分析器能解析H.264文件但不支持MP4。ZLMediaKit服务器在遇到I帧时会自动插入SPS和PPS配置帧,确保流符合标准格式。若缺少这些帧,客户端拉流时会报错。FFmpeg开发实战:从零基础到短视频上线》书中提供了更多FFmpeg开发细节。
56 0
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
|
2天前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
12 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
3天前
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
11 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
|
10天前
|
Web App开发 5G Linux
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季来临,计算机专业的毕业设计尤为重要,不仅关乎学业评价还积累实战经验。选择紧跟5G技术趋势的音视频APP作为课题极具吸引力。这里推荐三类应用:一是融合WebRTC技术实现视频通话的即时通信APP;二是具备在线直播功能的短视频分享平台,涉及RTMP/SRT等直播技术;三是具有自定义动画特效及卡拉OK歌词字幕功能的视频剪辑工具。这些项目不仅技术含量高,也符合市场需求,是毕业设计的理想选择。
32 6
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
|
9天前
|
编解码 Java Android开发
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
​SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等,可谓功能强大的APP直播框架。另一款APP直播框架RTMP Streamer支持RTMP直播和RTSP直播,不支持SRT协议的直播。而本文讲述的SRT Streamer支持RTMP直播和SRT直播,不支持RTSP协议的直播。有关RTMP Streamer的说明参见之前的文章《使用RTMP Streamer开启APP直播推流》,下面介绍如何使用SRT Streamer开启手机直播。
30 4
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
|
16天前
|
缓存 视频直播 Linux
FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务
《FFmpeg开发实战》书中介绍了轻量级流媒体服务器MediaMTX,适合测试但不适用于生产环境。SRS是一款国产开源服务器,支持RTMP、SRT等协议,适合生产使用。要启用SRS的SRT推流,需配置`srt.conf`,开启SRT服务并配置端口。在确保FFmpeg集成libsrt后,拉流则使用类似但带有`m=request`的地址。在Windows上,同样需要集成libsrt的FFmpeg来使用ffplay拉流。SRS的日志确认了推拉流的成功。书中提供更深入的FFmpeg开发知识。
46 2
FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务
|
23天前
|
视频直播 Windows
FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流
《FFmpeg开发实战》书中介绍了直播中的RTSP、RTMP和SRT协议,SRT提供更低延迟和稳定性。FFmpeg从4.0版起支持SRT,OBS Studio和MediaMTX等工具也已支持。在Windows环境下,通过集成libsrt的FFmpeg,可以建立SRT直播系统。MediaMTX日志显示SRT服务监听8890端口,OBS Studio设置SRT推流至"publish:live"。ffplay和VLC通过"read:live"拉流成功,验证了SRT推拉流功能。更多详情见《FFmpeg开发实战:从零基础到短视频上线》。
57 2
FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流
|
1月前
|
Web App开发 缓存 编解码
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
《FFmpeg开发实战》书中介绍了轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适用于复杂直播场景。SRS是一款强大的开源流媒体服务器,支持多种协议,起初为RTMP,现扩展至HLS、SRT等。在FFmpeg 6.1之前,推送给SRS的HEVC流不受支持。要播放RTMP流,Android应用可使用ExoPlayer,需在`build.gradle`导入ExoPlayer及RTMP扩展,并根据URL类型创建MediaSource。若SRS播放黑屏,需在配置文件中开启`gop_cache`以缓存关键帧。
91 2
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
|
1月前
|
Web App开发 缓存 Linux
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
《FFmpeg开发实战》书中第10章提及轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适合生产环境。推荐使用SRS或ZLMediaKit,其中SRS是国产开源实时视频服务器,支持多种流媒体协议。本文简述在华为欧拉系统上编译安装SRS和FFmpeg的步骤,包括安装依赖、下载源码、配置、编译以及启动SRS服务。此外,还展示了如何通过FFmpeg进行RTMP推流,并使用VLC播放器测试拉流。更多FFmpeg开发内容可参考相关书籍。
49 2
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流