ffmpeg
王者级废铁
博客就是备忘录,这里主要记录一些学习的内容或者总结
展开
-
ffmpeg重点之时间戳,PTS、DTS、time_base
这就是pts的转换。一个音频帧的AVFrame有nb_samples个sample,所以一个AVFrame耗时是nb_samples(1/44100)秒 即标准时间下duration_s=nb_samples(1/44100)秒, 转换成AVStream时间基下 duration=duration_s / av_q2d(st->time_base) 基于st->time_base的num值一般等于采样率,所以duration=nb_samples. pts=nduration=nnb_samples。原创 2024-03-25 14:35:03 · 1626 阅读 · 0 评论 -
ubuntu18.04安装ffmpeg
需要提供路径, 让ffmpeg ffprobe等命令找到需要的依赖。需要让os能够找到 ffmpeg ffprobe等命令。原创 2024-03-18 00:18:14 · 601 阅读 · 0 评论 -
H264压缩比和编码码率
在格式为YUV420的情况下,分辨率为1280x1024,帧率为60,每秒传输1280x1024x60X1.5x8 = 943,718,400 bit = 943.7184 Mbps,因此至少需要944Mb/s。这时设置H264的编码码率为9440kpbs,此时H264的压缩率为100:1。若是300:1则倒推设置码率为3146kbps,压缩比为80:1就是倒推码率11800。实际上264的压缩率没有这么高,这里只是进行举例介绍。265压缩率:500倍,实际300倍。264压缩率:250倍。原创 2023-03-27 17:43:20 · 3431 阅读 · 2 评论 -
ffmpeg推流参考文章
https://www.cnblogs.com/leisure_chn/p/10623968.htmlhttps://www.bilibili.com/read/cv12294853原创 2023-01-28 09:37:54 · 126 阅读 · 0 评论 -
Qt第三方库libvlc-qt——ubuntu上编译、安装,测试
vlc-qt源码下载:https://github.com/ntadej/vlc-qt。下载cmake源码:http://www.cmake.org/download/Qt第三方库libvlc-qt——ubuntu16.04上编译、安装,测试。下载VLC源码,进入网页等待几秒钟自动下载最新版。解压到 /usr/local。Qt配置 :5.14.2版本。原创 2022-12-29 16:43:30 · 630 阅读 · 0 评论 -
FFmpeg学习:视音频同步
视频和音频是各自独立播放的,并不同步。本文主要描述了如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放的。主要有以下几个方面的内容视音频同步简单介绍一般来说,视频同步指的是视频和音频同步,也就是说播放的声音要和当前显示的画面保持一致。想象以下,看一部电影的时候只看到人物嘴动没有声音传出;或者画面是激烈的战斗场景,而声音不是枪炮声却是人物说话的声音,这是非常差的一种体验。在视频流和音频流中已包含了其以怎样的速度播放的相关数据,视频的帧率(Frame Rate)指示视频一秒显示的帧数(图像原创 2022-12-08 11:14:00 · 1461 阅读 · 1 评论 -
FFmpeg打开媒体流或者网络流以及写媒体流时,各结构体创建、释放方式
在这里记录下FFmpeg各主要结构体创建、释放的方式2. 取流参数AVDictionary创建:AVDictionary* opts = NULL;配置:(官方参数列表)av_dict_set(&opts, “rtsp_transport”, “tcp”, 0);释放:av_dict_free(&opts);3. 媒体流AVFormatContext创建:AVFormatContext* ictx = NULL;释放:avformat_close_input(&ictx);4.原创 2022-12-07 09:47:25 · 728 阅读 · 0 评论 -
av_frame_free释放全部和av_frame_unref释放数据
AVFrame结构,av_frame_alloc申请内存,av_frame_free释放内存。容易混淆的是av_frame_unref,它的作用是释放音视频数据资源,而av_frame_free是释放所有资源,包括音视频数据资源和结构体本身的内存。可以从源码中看到,av_frame_free函数体内是先调用了av_frame_unref释放数据缓存,再free本身结构体内存。AVPacket结构,比较神奇的是,av_read_frame执行过程中,内部为形参pkt自动申请一块缓存用来存储音视频数据,而释放资转载 2022-12-05 11:39:28 · 1975 阅读 · 1 评论 -
使用sonic进行音频倍速播放
由于sonic库处理的数据为short类型或者float类型,但是ffmpeg重采样后的数据和SDL使用的数据都是uint8类型,所以这里数据长度就需要重新计算:原始的数据长度/(音频通道数 * S16类型数据所占字节数)其中audio->getAudioBuff() 以及audio->audioBuff就是音频解码后的PCM数据。原创 2022-11-07 10:52:33 · 692 阅读 · 1 评论 -
ffmpeg中PTS和DTS
计算视频长度: time(秒) = st->duration * av_q2d(st->time_base) ffmpeg内部的时间与标准的时间转换方法: ffmpeg内部的时间戳 = AV_TIME_BASE * time(秒) AV_TIME_BASE_Q=1/AV_TIME_BASE av_rescale_q(int64_t a, AVRational bq, AVRational cq)函数 这个函数的作用是计算a*bq / cq来把时间戳从一个时间基调整到另外一个时间基。PTS和DTS的时间基。转载 2022-09-22 14:53:56 · 1599 阅读 · 0 评论 -
QT跨平台使用libvlc播放视频
11、释放所有vlc对象(注:在释放libvlc_media_player_t之前,记得先将视频停止,避免的不必要麻烦)(注:用Qt的话,比如用QLabel,要用它的winID,并且强转成(void *)类型)8、检测媒体是否正在播放(注:这里的返回值可以强转成bool类型方便一点)//从发送事件的媒体播放器对象那里获取一个事件管理器。10、正在播放的媒体停止(停止再点击播放则重头播放)9、正在播放的媒体暂停(暂停再点击播放可以继续)2、根据给定的媒体对象创建一个播放器对象。原创 2022-09-21 10:37:47 · 448 阅读 · 0 评论 -
使用ffmpeg时出现undefined reference to `lzma_stream_decoder‘的错误解决
解决方法:加上-llzma选项。原创 2022-09-13 16:41:29 · 1192 阅读 · 0 评论 -
ffmpeg音频重采样
答案是不能,那怎样才能同时播放两个播放器的内容,比如声卡固定设置为48Khz,S16格式的,这个时候不管什么格式什么采样率的音频最终都要转为48Khz,S16格式的音频进行输出。将麦克风采集的和背景音乐的音频合并叠加,也就是混音,就需要统一格式,统一采样率,这样才能混音(amix)进行编码。重采样就是改变音频的采样率、sample format(采样格式)、声道数(channel)等参数。播放器1 44.1Khz(采样率) f32(格式) 2chn(通道数)1、音频重采样是为了将音频统一格式。...原创 2022-08-29 17:54:12 · 1720 阅读 · 0 评论 -
ffmpeg中支持的音频互相转换的采样格式和声道分布
采样格式最后一个字母如果是P就代表数据格式是平面模式,存储时其左声道和右声道的数据是分开存储的,左声道的数据存储在data[0],右声道的数据存储在data[1],每个声道的所占⽤的字节数为linesize[0]和linesize[1];如果最后一个字母不是P就代表是交错模式,存储时是按照LRLRLR…的格式交替存储在data[0]中,linesize[0]表示总的数据量。(每个LR为一个音频样本)linesize表示一个平面内总比特数(经过内存对齐), nb_samples表示一帧音频帧的采样点数。...原创 2022-08-27 17:31:46 · 1712 阅读 · 0 评论 -
ffmpeg by id和by name查找decoder的区别
同一个 AVCodecID 可能对应多个不同的编解码器 (AVCodec),他们有不同的 AVCodec.name。avcodec_find_decoder 根据AVCodecID查找,找到先注册的decoder则退出avcodec_find_decoder_by_name 根据decoder name去查找匹配的decoder,比如同样的AV_CODEC_ID_AAC,但它有“aac_fixed”、“libfdk_aac”等不同的decoder,如果我们要指定aac decoder,则可以使用AVCo转载 2021-10-25 21:15:37 · 113 阅读 · 0 评论 -
ffmpeg分配编解码器的上下文的作用
首先ffmpeg的解码器很多,但是当两个不同的流或者文件使用了同一个编解码器进行编解码,如果两个不同的流或者文件的数据都存在编解码器中,会造成编解码器的数据混乱,这时加入上下文保存两个流的数据,就不会造成编解码器中数据混乱。编解码器只需要从上下文读取原始数据,然后将经过编解码后的数据再次放回上下文,就不会造成数据混乱。为什么分配编解码器的上下文。原创 2021-10-25 21:25:07 · 322 阅读 · 0 评论 -
ffmpeg基础五:单独解码裸流aac或MP3或H264
ffmpeg基础五:单独解码裸流aac或MP3或H264用于解析输入的数据流并把它们分成一帧一帧的压缩编码数据。比较形象的说法就是把长长的一段连续的数据“切割”成一段段的数据。av_parser_parse2():解析数据获得一个Packet, 从输入的数据流中分离出一帧一帧的压缩编码数据。读取文件流,使用av_parser_parse2就可以获取出packet。这也是为什么后面使用。原创 2022-08-23 15:57:06 · 1429 阅读 · 0 评论 -
ffmpeg基础四:RTP协议
协议学习方法1、协议是什么:双方约定好如何传输消息,比如视频传输协议,要告诉你这个包是h264包,还是aac音频包,这个信息一般放在协议头,对方收到网络包,可以直接在协议头部获取出这些信息,所以协议的组成一般都是:协议头 + 数据2、学习这个协议的作用:这个协议用来干什么的3、将协议抽象成可靠传输机制,他要保证能把数据发送给对方如何保证传输,并且还让对方能够快速使用数据:加一些字段来告诉对方一些属性,比如TCP协议头里的字段,序列号,确认号,标志位,这些都是保证数据传输的4、如何通信呢。原创 2022-08-23 14:44:19 · 4076 阅读 · 0 评论 -
ffmpeg基础三:H264,从MP4文件获取(av_bsf_get_by_name(“h264_mp4toannexb“))和从TS流获取保存H264
也就是说,对某个IDR帧之后的帧,解码器不会参考这个IDR帧之前的任何帧做解码,对某个I帧之后的帧,解码器可能会参考这个I帧之前的帧做解码。核心作用:H.264 引入 IDR 帧是为了解码的重同步,当解码器解码到 IDR 帧时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。I 帧和 IDR 帧都是使用帧内预测,本质上是同一个东西,在解码和编码中为了方便,将视频序列中第一个 I 帧和其他 I 帧区分开,所以把第一个 I 帧称作 IDR,这样就方便控制编码和解码流程。原创 2022-08-23 14:29:01 · 3607 阅读 · 1 评论 -
ffmpeg基础二:AAC保存为带有ADTS
是AAC⾳频的传输流格 式。有的时候当你编码AAC裸流的时候,会遇到写出来的AAC⽂件并不能在PC和⼿机上播放,很⼤的可能就是AAC⽂件的每⼀帧⾥缺少了ADTS头信息⽂件的包装 拼接。⼀个AAC原始数据块⻓度是可变的,对原始帧加 上ADTS头进⾏ADTS的封装,就形成了ADTS帧。这种格式的特 征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中间开始 的解码,即它的解码必须在明确定义的开始处进⾏。这两种的header的格式也是不同的,⽬前⼀般编码后的和抽取出的都是 ADTS格式的⾳频流。原创 2022-08-23 11:48:00 · 902 阅读 · 0 评论 -
ffmpeg基础二:AAC
AAC的 ADTS格式可以在任意帧解码,也就是说它每⼀帧都有头信息。ADIF只有⼀ 个统⼀的头,所以必须得到所有的数据后解码原创 2022-08-23 11:15:15 · 211 阅读 · 0 评论 -
ffmpeg基础一:解封装
ffmpeg基础一:解封装原创 2022-08-23 10:42:54 · 232 阅读 · 0 评论 -
msys2使用QT的mingw编译器编译ffmpeg
window编译ffmpeg mingw,因此要在windows搭建一个模拟linux环境,下载安装MSYS-1.0.11, 网址:https://www.msys2.org/但是编译x264的时候出现了 No working C compiler found的错误,有可能是X264版本太高的问题。安装完成后,将Qt的mingw32的库全部转移过来(直接拷贝就可以)写一个helloword的小程序测试一下。拷贝完成后,运行mingw32.exe。可以看到有输出,证明可以使用。我这里安装在了默认的路径。...原创 2022-08-15 18:41:25 · 1335 阅读 · 0 评论 -
使用Cmake通过mingw32编译SDL
使用Cmake通过mingw32编译SDL报错:Error inconfiguration process,preject files may be invalid(已解决)原创 2022-08-15 13:45:27 · 423 阅读 · 0 评论 -
yuv420文件通过C语言分别读取出Y,U,V
YUV 4:2:0,每四个 Y 分量共用一对 UV 分量,每像素占用 (Y + 0.25U + 0.25V = 8 + 2 + 2 = 12bits)1.5 字节。YUV 4:2:2,每两个 Y 分量共用一对 UV 分量,每像素占用 (Y + 0.5U + 0.5V = 8 + 4 + 4 = 16bits)2 字节;YUV 4:4:4,每一个 Y 分量对于一对 UV 分量,每像素占用 (Y + U + V = 8 + 8 + 8 = 24bits)3 字节;原创 2022-08-14 23:12:38 · 1447 阅读 · 0 评论 -
metaRTC使用hisiv400编译指南
metaRTC使用hisiv400编译指南原创 2022-07-11 14:09:53 · 349 阅读 · 0 评论 -
ffmpeg中将avi文件恢复,或者MP4转到avi
int nListCnt=0, ret; ST_VIDEO_DB_DATA *pstVideoDbData; SearchList.clear(); QDateTime qttime; qttime= QDateTime::currentDateTime(); QString str = qttime.toString("yyyyMMdd_hhmmss"); char out_file[265] = {0}; strcpy(out_file,tr("原创 2021-12-11 18:49:35 · 639 阅读 · 0 评论 -
qt制作播放器-进度条属性设置
QSlider::groove:horizontal {border: 1px solid #4A708B;background: #C0C0C0;height: 30px;border-radius: 1px;padding-left:-1px;padding-right:-1px;}QSlider::sub-page:horizontal {background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #B1B1B1.原创 2022-05-05 10:46:48 · 1357 阅读 · 0 评论 -
ffmpeg获取文件时长
/** 获取MP4文件时长,ffmpeg库实现 */int record::getMP4_duration_ffmpeg(const char *filename,long long *seconds){ if(filename == NULL) { printf("getMp4_duration_filename erro"); return -1; } AVFormatContext *ifmt_ctx = NULL;原创 2022-05-04 10:47:36 · 2071 阅读 · 0 评论 -
goto语句编译错误解决
最近写ffmpeg保存rtsp流的程序,会使用到goto语句goto end;然后在程序中计入了end:结果编译的时候会报一个错误error: jump to label 'end' [-fpermissive]解决以上问题就是要把全部变量初始化都放在函数开头,要么全部变量就不让它初始化,也就是在goto end调用之前把所有的变量初始化完,不能在goto和end定义之间出现任何初始化变量的步骤...原创 2022-04-20 17:22:27 · 1852 阅读 · 0 评论