FFMPEG音视频同步原理
录像音视频同步原理分析及PTS计算公式
录像⾳视频同步原理分析及PTS计算公式图解分析⾳视频同步要分别保证开始的PTS⼀样,PTS是控制帧的显⽰时间的,所以要实现⾳视频同步必须分别设置⾳视频的PTS。
注:⾳、视频最后⼀帧的PTS时刻不⼀定相同。
1. 视频时间戳计算pts = count++ *(1000/fps); //其中count初始值为0,每次打完时间戳count加1.//在ffmpeg,中的代码为pkt.pts= count++ * (Ctx->time_base.num * 1000 / Ctx->time_base.den);2. ⾳频时间戳pts = count++ * (frame_size * 1000 / sample_rate)//在ffmpeg中的代码为pkt.pts= count++ * (Ctx->frame_size * 1000 / Ctx->sample_rate);FFmpeg例⼦视频:// 视频帧的播放时间依赖pts字段,⾳频和视频都有⾃⼰单独的pts// ⾳视频同步要以视频或⾳频为参考标准,然后控制延时来保证⾳视频的同步,最简单的是以⾳频为准同步视频// 录⾳编码时pts是⼀定的,由编码器以相同频率写⼊,⾳视频录制时总时长是⼀定的,都在同⼀个时间坐标序列上,但长度不⼀定⼀样 // 计算⾳视频pts,都是根据每秒算出有多少个⾳视频帧,然后根据time_base,算出每帧占有多少个时间单位,即为pts差值long pts = 0;// 计算视频公式: pkt.pts = count++ * (Ctx->time_base.num * 1000 / Ctx->time_base.den);//pts = (codec.Framecnt - 1) * (codec.GetCodecCtx()->pkt_timebase.num * 1000 / codec.GetCodecCtx()->pkt_timebase.den);pts = (codec.Framecnt - 1) * (codec.GetCodecCtx()->pkt_timebase.num * 1000 / 25);Console.WriteLine("...........video...pts:" + pts);// 初始化⾳视频共同的timerCvNetVideo.Play.AVPtsTimer.Init();// 调整时间戳与时间轴跑过的timer之间的延时while (CvNetVideo.Play.AVPtsTimer.Timer<pts){Thread.Sleep(1);CvNetVideo.Play.AVPtsTimer.Sleep_Count++;Console.WriteLine("...........video...sleep count:" + CvNetVideo.Play.AVPtsTimer.Sleep_Count);}⾳频:#region 设置⾳频的pts// 计算⾳频PTS公式:pkt.pts= count++ * (Ctx->frame_size * 1000 / Ctx->sample_rate);long pts = frame_count++ * (output_codec_context->frame_size * 1000 / output_codec_context->sample_rate);// 初始化⾳视频共同的timerCvNetVideo.Play.AVPtsTimer.Init();// 调整时间戳与时间轴跑过的timer之间的延时while (CvNetVideo.Play.AVPtsTimer.Timer < pts){Thread.Sleep(1);CvNetVideo.Play.AVPtsTimer.Sleep_Count++;Console.WriteLine("...........audio...sleep count:" + CvNetVideo.Play.AVPtsTimer.Sleep_Count);}frame->pts = pts;frame->pkt_dts = pts;#endregionConsole.WriteLine("...........audio...pts:" + pts);Timer时间戳计算:/// <summary>/// PTS-Timer/// </summary>public class AVPtsTimer{/// <summary>/// 初始化时的时间戳/// </summary>private static long Start_Stamp { get; set; }public static bool IsInit = false;/// <summary>/// 休眠次数/// </summary>public static long Sleep_Count { get; set; }/// <summary>/// 时间轴跑过的时间/// </summary>public static long Timer { get { return ConvertDataTimeToLong(DateTime.Now) - Start_Stamp; } }public static void Init(){if (IsInit){return ;}Start_Stamp = ConvertDataTimeToLong(DateTime.Now);IsInit = true;}/// <summary>/// 计算时间戳/// </summary>/// <param name="dt"></param>/// <returns></returns>public static long ConvertDataTimeToLong(DateTime dt){DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));TimeSpan toNow = dt.Subtract(dtStart);long timeStamp = toNow.Ticks;timeStamp = long.Parse(timeStamp.ToString().Substring(0, timeStamp.ToString().Length - 4));return timeStamp;}}注:⾳视频同步仍然存在瑕疵,时间戳和延时已处理,但视频还是存在不同步的情况,应该是计算过程中直接使⽤的每秒25帧的值的问题,具体是多少还得再看。
音视频同步的原理及实现方案-技术方案
音视频同步的原理及实现方案-技术方案音视频同步是我们观看视频的一个基本体验,尤其对于视频画面中能看到声源动作(如:嘴型)的场景,音视频同步问题非常影响体验。
在短视频与直播APP中,采集端作为音视频的生产者,如果采集端产生的音视频源本身就无法保证同步,那么后面不管经过什么处理,都很难再让用户看到音视频同步的画面了,因此,在采集端保证音视频同步上尤其重要。
那么如何保证app在各种正常/非正常状况下尽量保证输出同步的音视频?本文就是讲述我们是如何解决上述问题的。
音视频同步的原理音视频采集的数据分别来自于麦克风与摄像头,而摄像头与麦克风其实是两个独立的硬件,而音视频同步的原理是相信摄像头与麦克风采集数据是实时的,并在采集到数据时给他们一个时间戳来标明数据所属的时间,而编码封装模块只要不改动音视频时间的相对关系就能保证音频与视频在时间上的对应。
如此封装好数据之后,播放端就能够根据音视频的时间戳来播放对应的音视频,从实现音视频同步的效果。
时间戳参考标准取格林威治时间做为对比标准,即音视频时间戳都为采集时间点相对于格林威治标准时间的时间差;取系统开机时间做为对比标准,即音视频时间戳都是采集时间点相对于手机开机时间的时间差。
目前iOS上AVCaptureSession这套API 就是参考这个时间标准给的时间戳。
其它时间戳标准基于“开源项目1”的音视频同步探讨原生某开源框架如图:简介音/视频被采集到之后会先经过音/视频处理模块,音/视频在被处理之后才进入计算时间戳的模块。
在帧到达时记一个计时起点,然后根据采集的帧间隔对接下来每一帧的时间戳进行计算:frameTimeStamp = lastFrameTimeStamp + frameDuration。
优点能输出frame duration稳定的音视频时间戳。
风险无论是音频还是视频,在手机过热、性能不足等极端情况下有可能出现采集不稳定的情况,比如说预计1s采集30帧,实际只采集到28帧,而音视频的时间戳是通过累加来计算的,这样就有会出现音视频不同步的情况。
ffmpeg 编解码原理
ffmpeg 编解码原理ffmpeg 编解码原理什么是ffmpegFFmpeg 是一个开源的多媒体框架,它包含了一个用于音频和视频编解码的库。
它可以执行各种多媒体操作,如格式转换、视频剪辑、音频处理等。
本文将重点解释 ffmpeg 的编解码原理。
编解码的基本概念编码编码是将原始的音视频数据转换成特定格式的过程。
原始的音视频数据通常由大量的数值表示,而编码将这些数值进行有损或无损的压缩,以减小数据大小的同时保留尽可能多的信息。
解码解码是编码的逆过程,它将经过编码的音视频数据重新恢复为原始的数据格式。
解码器通过解析编码后的数据,并根据预定的算法还原其原始的数值,最终生成可供播放或处理的音视频数据。
ffmpeg 的编解码原理输入与输出ffmpeg 的编解码过程涉及两个重要的概念: 输入 (input) 和输出 (output)。
输入通常是未经编码的音视频数据文件,而输出则是编码后的音视频数据文件。
编码器与解码器ffmpeg 使用编码器 (encoder) 和解码器 (decoder) 来进行编解码操作。
编码器将输入的音视频数据流转换为特定编码格式,而解码器则将编码后的数据流解码为原始的音视频数据。
编码参数编码过程中,会有多种参数用于控制编码器的行为。
常见的参数包括帧率、比特率、分辨率等。
这些参数会影响编码后的音视频文件的质量和大小。
编解码过程1.读取输入文件: ffmpeg 从输入文件中读取原始的音视频数据。
2.解码音视频数据: ffmpeg 使用相应的解码器将音视频数据解码为原始格式的数据。
3.修改或添加编码参数: 可选地,ffmpeg 可以根据需要修改或添加编码参数,以调整输出文件的质量和大小。
4.编码音视频数据: ffmpeg 使用相应的编码器将音视频数据进行编码,生成编码后的音视频数据流。
5.写入输出文件: ffmpeg 将编码后的数据流写入输出文件。
总结本文介绍了 ffmpeg 的编解码原理。
音视频同步原理
视频流中的DTS/PTS到底是什么?DTS(解码时间戳)和PTS(显示时间戳)分别是解码器进行解码和显示帧时相对于SCR(系统参考)的时间戳。
SCR可以理解为解码器应该开始从磁盘读取数据时的时间。
mpeg文件中的每一个包都有一个SCR时间戳并且这个时间戳就是读取这个数据包时的系统时间。
通常情况下,解码器会在它开始读取mpeg流时启动系统时钟(系统时钟的初始值是第一个数据包的SCR值,通常为0但也可以不从0开始)。
DTS 时间戳决定了解码器在SCR时间等于DTS时间时进行解码,PTS时间戳也是类似的。
通常,DTS/PTS 时间戳指示的是晚于音视频包中的SCR的一个时间。
例如,如果一个视频数据包的SCR是100ms(意味着此包是播放100ms以后从磁盘中读取的),那么DTS/PTS值就差不多是200 /280ms,表明当SCR 到200ms时这个视频数据应该被解码并在80ms以后被显示出来(视频数据在一个buffer中一直保存到开始解码)下溢通常发生在设置的视频数据流相关mux率太高。
如果mux率是1000000bits/sec(意味着解码器要以1000000bits/sec的速率读取文件),可是视频速率是2000000bits/sec(意味着需要以2000000bits/sec的速率显示视频数据),从磁盘中读取视频数据时速度不够快以至于1秒钟内不能够读取足够的视频数据。
这种情况下DTS/PTS时间戳就会指示视频在从硬盘中读出来之前进行解码或显示(DTS/PTS时间戳就要比包含它们的数据包中的SCR时间要早了)。
如今依靠解码器,这基本已经不是什么问题了(尽管MPEG文件因为应该没有下溢而并不完全符合MPEG 标准)。
一些解码器(很多著名的基于PC的播放器)尽可能快的读取文件以便显示视频,可以的话直接忽略SCR。
注意在你提供的列表中,平均的视频流速率为~3Mbps(3000000bits/sec)但是它的峰值达到了14Mbps (相当大,DVD限制在9.8Mbps内)。
ffmpeg转码MPEG2
ffmpeg转码MPEG2ffmpeg转码MPEG2-TS的音视频同步机制分析一、FFmpeg忽略了adaptation_field()数据FFmpeg忽略了包含PCR值的adaptation_filed数据; 代码(libavformat/mpegts.c)分析如下:/* 解析TS包*/int handle_packet(MpegTSContext *ts, const uint8_t *packet){... pid = AV_RB16(packet + 1) & 0x1fff;//SYNTAX: PIDis_start = packet[1] & 0x40;//SYNTAX:payload_unit_start_indicator... /* continuity check (currently not used) */cc = (packet[3] & 0xf);//SYNTAX: continuity_counterexpected_cc = (packet[3] & 0x10) ? (tss->last_cc + 1) & 0x0f: tss->last_cc;cc_ok = (tss->last_cc < 0) || (expected_cc == cc);tss->last_cc = cc; /* skip adaptation field */afc = (packet[3] >> 4) & 3;//SYNTAX:adaptation_field_controlp = packet + 4;if (afc == 0) /* reserved value */return 0;if (afc == 2) /* adaptation field only */return 0;if (afc == 3){/* skip adapation field */p += p[0] + 1;}...}二、解码初始时间戳的计算原理如下:a. 分析阶段: 分析多个TS包,并找到第一个PES包的PTS,做为初始偏移量;b. PTS置零: 分析与初始化阶段完成后, 解码TS的第一个PES包,得到其PTS值, 减去初始偏移量,使得第一个编码后帧的PTS为零;c. DTS/PTS增量累加;1. PTS置零代码分析main(){|-- ...|-- parse_options(){|-- …|-- opt_input_file(){|-- …av_find_stream_info(ic);timestamp= start_time;timestamp+= ic->start_time;…input_files_ts_offset[nb_input_files] =input_ts_offset - (copy_ts ? 0 : timestamp);…}…}|-- transcode(){|-- …for( ; received_sigterm == 0; ){AVPacket pkt;…ret = av_read_frame(is,&pkt);…pkt.dts+=av_rescale_q(input_files_ts_offset[nb_input_files], AV_TIME_BASE_Q,ist->st->time_base);}} 三、编码音视频帧的DTS/PTS计算音频帧的DTS/PTS计算:一个音频帧(对于AAC来说, 是1024个采样点),相对于音频采样率(如44100个采样点/second = 44.1KHz)来说,累加上每帧的增量(1024*1000/44100 = 23ms/frame)st->time_base.den = 1000 //时钟基, 1 second = 1000 msframe_size = 1024 //一帧= 1024个采样点st->pts = {val=0,num=22050,den=44100}; // 音频采样率av_frac_add(&st->pts,(int64_t)st->time_base.de n * frame_size);/* f.val = f.val + ((f.num + incr) /f->den) */static void av_frac_add(AVFrac *f, int64_t incr){int64_t num, den;num = f->num + incr;den = f->den;if (num < 0){f->val += num / den;num = num % den;if (num< 0){num += den;f->val--;}}else if (num >= den){f->val += num / den;num = num % den;}f->num = num;st->pts = {val=23, // 计算后的时间戳num=31750, // 上一帧未播放完的余值den=44100}视频帧的DTS/PTS计算:一个视频帧,相对于视频帧率来说(如25 frames/second),累加上每帧的增量(1000ms/25frames =40ms/frame)time_base.den = 1000time_base.num = 1st->pts ={val=0, num=12, den=25},av_frac_add(&st->pts,(int64_t)st->time_base.de n * st->codec->time_base.num);st->pts ={val=40, num=12, den=25}四、解码时间戳与编码时间戳的同步机制正常的转码流程(ffmpeg version 0.8.10 在ffmpeg.c的transcode函数for(; received_sigterm == 0;){}循环中):step1. 解析PES包,得到时间戳、流索引、PES包长度等数据,并将这个PES包压入到PES包队列;见libavformat/mpegts.c函数int mpegts_push_data();step2. 从PES包队列中取出一个PES包;见libavformat/utils.c函数int av_read_frame();step3. 将这个PES包的PTS和/或DTS减去初始时间戳, 见ffmpeg.cpkt.dts+=av_rescale_q(input_files_ts_offset[ist->file_index],AV_TIME_BASE_Q,ist->st->time_base);pkt.pts+=av_rescale_q(input_files_ts_offset[ist->file_index],AV_TIME_BASE_Q,ist->st->time_base);并根据音频/视频流的采样率得到下一帧的PTS和/或DTS;见ffmpeg.c函数int output_packet();ist->next_pts = ist->pts=av_rescale_q(pkt->dts, ist->st->time_base,AV_TIME_BASE_Q);pkt_pts =av_rescale_q(pkt->pts,ist->st->time_base,AV_TIME_BASE_Q);如果本帧解码得到的时间戳和上一帧解码得到的时间戳的差值超过了设定的阈值,为了使输出的时间戳连续或同步,则需要调整,如,视频帧时间戳不连续,则丢弃音频帧以同步音频帧时间戳不连续,则插件静音帧;或是其它的策略。
ffmpeg 技术原理
ffmpeg 技术原理
FFmpeg是一种音视频处理核心技术,广泛应用于录制、转换和流式传输音频和视频。
以下是FFmpeg技术原理的一些简要介绍:
1.读取视频文件:FFmpeg首先将视频文件读取到内存中,然后进行后续的
处理。
2.解码和编码:在读取视频文件后,FFmpeg对其进行解码,即将原始数据
根据编码定义解析成YUV色彩空间。
接着,FFmpeg会对YUV色彩空间的图形进行压缩处理,生成指定格式的文件。
在这个过程中,FFmpeg可以调整各种参数,如帧率、像素、画质等。
3.依赖库:FFmpeg的实现主要依赖于libavcodec和libavformat等库,它
们提供了编解码和格式转换等功能。
4.跨平台解决方案:FFmpeg是一个完整的跨平台解决方案,可以在不同的
操作系统上运行。
FFmpeg如何同步音视频的解决方案
FFmpeg如何同步音视频的解决方案在音视频处理领域,FFmpeg是一个非常强大的开源工具,它能够实现音视频的编码、解码、转码、合并等各种操作。
在处理音视频文件时,我们经常会遇到一个重要的问题,那就是音频和视频不同步的情况。
本文将介绍FFmpeg如何解决音视频同步问题的解决方案。
1. 原因分析在音视频处理过程中,音频和视频之间的同步问题主要是由于编码和解码的过程中产生的延迟导致的。
一方面,不同的编码器对音频和视频的处理速度有所差异,会导致音频和视频的播放速度不一致;另一方面,网络传输、存储介质读取等因素也会导致音频和视频的同步性出现问题。
2. FFmpeg解决方案FFmpeg提供了多种方式来解决音视频同步问题,我们可以根据具体情况选择合适的方法。
2.1 调整音频和视频的时间基准音频和视频在处理过程中都有自己的时间基准,通过调整时间基准可以实现对音频和视频的同步控制。
可以通过FFmpeg提供的`-async`参数来调整音频与视频的同步,例如将音频延迟50ms可以使用以下命令:```ffmpeg -i input.mp4 -itsoffset 0.05 -i input.mp4 -map 0:v -map 1:a -c:a copy -c:v copy output.mp4```其中`-itsoffset`参数用于指定音频的延迟时间,单位为秒。
2.2 调整音频和视频的帧率音频和视频的帧率不一致也会导致音视频的同步问题,可以通过调整帧率来实现音视频的同步。
可以使用FFmpeg提供的`-r`参数来实现帧率的调整,例如将音频和视频的帧率设置为25帧/秒可以使用以下命令:```ffmpeg -i input.mp4 -r 25 -i input.mp4 -map 0:v -map 1:a -c:a copy -c:v copy output.mp4```2.3 调整音频和视频的缓冲大小音频和视频的缓冲大小不一致也会导致音视频的同步问题,可以通过调整缓冲大小来实现音视频的同步。
FFmpeg如何同步音视频的解决方案
【转】如何同步视频2010-07-16 10:18转载自fandy586最终编辑fandy586如何同步视频PTS和DTS幸运的是,音频和视频流都有一些关于以多快速度和什么时间来播放它们的信息在里面。
音频流有采样,视频流有每秒的帧率。
然而,如果我们只是简单的通过数帧和乘以帧率的方式来同步视频,那么就很有可能会失去同步。
于是作为一种补充,在流中的包有种叫做DTS(解码时间戳)和PTS(显示时间戳)的机制。
为了这两个参数,你需要了解电影存放的方式。
像MPEG等格式,使用被叫做B帧(B表示双向bidrectional)的方式。
另外两种帧被叫做I帧和P帧(I表示关键帧,P表示预测帧)。
I帧包含了某个特定的完整图像。
P帧依赖于前面的I帧和P帧并且使用比较或者差分的方式来编码。
B帧与P帧有点类似,但是它是依赖于前面和后面的帧的信息的。
这也就解释了为什么我们可能在调用avcodec_decode_video以后会得不到一帧图像。
所以对于一个电影,帧是这样来显示的:I B B P。
现在我们需要在显示B帧之前知道P帧中的信息。
因此,帧可能会按照这样的方式来存储:IPBB。
这就是为什么我们会有一个解码时间戳和一个显示时间戳的原因。
解码时间戳告诉我们什么时候需要解码,显示时间戳告诉我们什么时候需要显示。
所以,在这种情况下,我们的流可以是这样的:PTS: 1 4 2 3DTS: 1 2 3 4Stream: I P B B通常PTS和DTS只有在流中有B帧的时候会不同。
当我们调用av_read_frame()得到一个包的时候,PTS和DTS的信息也会保存在包中。
但是我们真正想要的PTS是我们刚刚解码出来的原始帧的PTS,这样我们才能知道什么时候来显示它。
然而,我们从avcodec_decode_video()函数中得到的帧只是一个AVFrame,其中并没有包含有用的PTS值(注意:AVFrame并没有包含时间戳信息,但当我们等到帧的时候并不是我们想要的样子)。
音视频同步(播放)原理
音视频同步(播放)原理每一帧音频或视频都有一个持续时间:duration:采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。
正常人听觉的频率范围大约在20Hz~20kHz之间,根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在40kHz左右。
常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz 等,如果采用更高的采样频率,还可以达到DVD的音质对采样率为44.1kHz的AAC音频进行解码时,一帧的解码时间须控制在23.22毫秒内。
背景知识:(一个AAC原始帧包含一段时间内1024个采样及相关数据)分析:1) AAC音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)一帧1024个sample。
采样率Samplerate 44100KHz,每秒44100个sample, 所以根据公式音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率当前AAC一帧的播放时间是= 1024*1000000/44100= 22.32ms(单位为ms)2) MP3mp3 每帧均为1152个字节,则:frame_duration = 1152 * 1000000 / sample_rate例如:sample_rate = 44100HZ时,计算出的时长为26.122ms,这就是经常听到的mp3每帧播放时间固定为26ms的由来。
3)H264视频的播放时间跟帧率有关 frame_duration = 1000/fps例如:fps = 25.00 ,计算出来的时常为40ms,这就是同行所说的40ms一帧视频数据。
理论上的音视频(播放)同步是这样的:由此得到了每一帧数据的持续时间,音视频交叉存储在容器中:一个时间轴:时间轴:0 22.32 40 44.62 66.96 80 89.16 111.48 120 . ...............音频:0 22.32 44.62 66.96 89.16 111.48 .. ..............视频:0 40 80 120 .. ..............即视频的持续时间相加和音频的持续时间相加作比较,谁小写入哪个。
一种基于FFMPEG的音视频同步算法
doi: 10.12052/gdutxb.160040一种基于FFMPEG的音视频同步算法曾碧,张宇(广东工业大学 计算机学院,广东省 广州市 510006)摘要: 在视频监控系统中,音视频的同步传输是一个非常关键的问题. 由于音视频数据量大小的差异以及网络状况的不同,使得在其采集、传输、编解码的过程中,存在失同步的可能. 针对这些缺陷,提出一种利用时间戳将采集时间存在相关性的音频和视频数据存入一个固定的同步数据结构中,并在采集、编码、传输、接收、解码以及播放过程中始终加以同步控制. 最后将FFMPEG移植到Android平台对该算法进行实验,结果表明,该同步算法具有较稳定的同步效果,能够很好地满足应用场景下的音视频同步需求,同时对Android平台的音视频处理提出了新方法,具有很好的工程实践意义.关键词: 视频监控系统;FFMPEG;Android;音视频同步中图分类号: TP37 文献标志码: A 文章编号: 1007–7162(2017)04–0058–07A Research on Synchronous Transmission for Audio and VideoBased on FFMPEGZeng Bi, Zhang Yu(School of Computers, Guangdong University of Technology, Guangzhou 510006, China) Abstract: In video-monitor system, the synchronous transmission of audio and video is a key issue. The audio and video being out of synchronization was caused by the difference among the size of audio data and video data in the procedure of capturing, transmitting and encoding. To solve these problems, a solution is proposed which defines a data structure to store the time-related frames of audio and video data and control the synchronization of audio and video data through all the procedure. At last, the FFMPEG project is ported to Android device to do the experiment.It turns out that the algorithm proposed in this research has a good effect of synchronization. It can meet the need of synchronization in the specified scenes. At the same time, the new method of audio and video processing of Android platform is proposed, which is of great significance in engineering practice.Key words: video monitor system; FFMPEG; Android; audio and video synchronization随着嵌入式计算技术的发展,家庭智能服务机器人已经从提供单一的家庭服务演变为多功能的智能载体. 家庭智能服务机器人逐渐具备了家用安防视频监控等的功能. 而移动互联网时代下,视频监控终端逐渐多元化,Google公司研发的Android平台逐渐成为移动智能终端的主流操作系统之一. Android系统基于强大的Linux内核,但是,其自身的多媒体系统却不够强大,体现在其对于音视频编码和封装格式的支持有限. 在工程实践中,不能满足应用开发者多媒体处理需求,在视频监控终端的应用场景中尤为突出.在视频点播(Video on Demand)、安防监控等多媒体应用场景中,音视频同步对于服务质量(Quality of Service)非常关键,是直接影响用户体验的关键点[1-2]. 国内外不少学者针对音视频同步问题进行了研究[3-9]. 目前已有若干种方法,包括需要全网同步化时钟的时间戳同步技术[3],基于反馈进行同步[4],基于流媒体网络协议的同步方法[5-7],根据视频内容中对象(如唇型)进行同步[8],借鉴信息隐藏算法等将音频编码数据嵌入视频编码过程中[9-11]等等. 这些方法都存在一些不足和缺陷,如唇型同步在视频内容中没有唇时无法进行;如将音频数据嵌入H.264的编码第 34 卷第 4 期广东工业大学学报Vol. 34 No. 4 2017 年 7 月Journal of Guangdong University of Technology July 2017收稿日期:2016-03-09基金项目:国家基金广东省联合基金重点项目(U1201251);广东省产学研合作专项资助项目(2014B090904080)作者简介:曾碧(1963–),女,教授,博士,CCF高级会员(E20-0007403S),主要研究方向为嵌入式系统与智能技术、信息物理融合系统.中的方法需要对编解码器代码进行修改,理论要求高,实现复杂. 而基于流媒体传输协议的同步方法不仅支持异构网络环境,而且具有实时性好等优点,适合运用在视频监控系统中解决音视频同步问题. 因此,本文针对家庭服务机器人视频监控的需求,提出一种新的音视频同步方案及同步算法. 采用Android 设备作为客户端,使用RTP(Real-time Transport Protocol)等作为音视频数据传输协议,对所提的方案和算法进行了验证. 实验结果表明本算法具有同步相位失真小,同步效果稳定的优势.1 音视频失同步1.1 失同步原因分析在音视频数据采集过程中,由于程序是顺序执行的,而且操作系统对于进程是异步调度执行,因此,不可能做到音频和视频的采集时间完全相同,这里会使得两种数据的对应关系不正确;而在接下来的音视频编码过程中,由于一帧视频数据相对于一帧音频数据要大很多,对视频进行编码的时间相对于一个音频采样的编码时间要长很多.编码数据在发送过程中要按照RTP协议的格式来进行打包,在打包的过程中,由于编码后的一帧视频数据长度仍然远大于一帧编码后的音频采样数据.因此,在将编码数据封装进RTP包的过程中,这个长度差异同样地会引起音频和视频数据的失同步.在音视频数据进行传输的过程中,由于RTP协议是一种尽最大努力交付的协议,不具备可靠传输的特点,受网络状况影响较大,当网络状况比较拥堵时,数据包存在延时、丢失、乱序到达等可能性. 而对于音视频数据,一旦出现丢包的问题,将可能影响到编码数据的完整性,特别是当H.264的数据单元超过了MTU的大小时,要采用分包发送,此时将会引起视频编码数据的不完整,在解码过程中将出错,这也会引起失同步问题.在智能终端Android平台上,应用程序进行音视频的解码播放过程中,如果不协调控制好音频数据和视频数据的时间戳而直接予以播放,那么也将引起失同步问题.1.2 音视频同步的主观评价标准根据ITU-R BT.1359-1[12]的内容,人类生物学视听系统对于声音和视频的不同步的察觉程度是在一个具体的范围内的. 文献表明,当声音的呈现时间T sound与视像的呈现时间T vision的差值ΔT在-90 ms到180 ms之间时,人类主观感受是同步的,见图1所示.2 嵌入式系统音视频同步实现方法2.1 系统结构在移动视频监控系统中,一般音视频数据是从前端摄像机采集,使用G.729算法和H.264标准分别进行压缩编码后,进行RTP打包,通过网络发送到流媒体服务器进行存储转发,最后实时流转发到客户端,采用Android设备进行接收. 在整个传输与转发的过程中,对同步有影响的部分包括前端摄像机的采集模块和编码打包模块,以及Android客户端的解码和播放模块. 因此,本文抽取出其中最关键部分并均予以同步控制,如图2所示.2.2 同步数据结构以及缓冲区在前端采集音视频的过程中,采用的是多线程的程序设计方法,在操作系统中,内核调度线程执行具有异步性等导致无法严格保证采集到的音、视频能够完全同步. 而根据人类生物学声音视像系统对同步的感知能力,可以选取在图1中的可检测阈值(即ΔT在[-125 ms,45 ms]区间内)作为门限,将采集到的原始声音和视频数据认为是同一时刻获取到的. 通过对采集音视频数据的过程中进行观察记录并统计分析,可检测阈值范围内有3帧音频数据和2帧视频数据的时间戳满足这个要求. 这5个数据单元在时间上的强相关性便于在接收端通过时间戳来进行同步,因此,使用新定义的数据结构把这5个数据单元从逻辑上封装为一个整体. 如图3所示,采集模块采集到的5个数据单元将封装到一个同步数据节点中,所有同步数据节点以本节点内的时间戳上图 1 人类生物学声音视像系统对音视频同步的感知Fig.1 Perceptual ability of audio and video synchronization of human biology voice video system图 2 视频监控系统框图Fig.2 The skeleton of video monitor system第 4 期曾碧,等:一种基于FFMPEG的音视频同步算法59最小的数据单元的时间戳作为本同步数据块时间戳. 在采集以后的处理中,所有操作都是基于这个同步数据节点来进行的.同步数据节点是时间上具有强相关性的数据单元的存储形式,使用如下的数据结构表示.struct synchronous_block{int64_t m_timestamp;synchronous_subblock m_avdata[5];};struct synchronous_subblock{enum AV_TYPE_FLAG m_type;void *m_avdata_p;};其中synchronous_block结构体中的m_time stamp是在整个结构体中最先捕获的视频帧的时间戳,单位为us;m_avdata是用来保存整个包中的2帧视频数据和3帧音频数据的数组.s y n c h r o n o u s_ subblock中的m_type是用来指明这个结构体是用来存储的音频还是视频数据;m_avdata_p成员则指向采集的具体的音视频数据.在各大模块之间进行数据传递需要用到缓冲区,队列中存储的元素就是同步数据结构体类型的.struct AVDataBuffer{void*buff_avdata[AVDATA_BUFFER];unsigned short head_loca;unsigned short tail_loca;unsigned short frame_num;}AVDataBuffer;如上AVDataBuffer就是视频缓冲区的数据结构,其中buff_avdata为void*类型的指针数组,其中的指针指向封装后的同步数据结构. head_loca为缓冲区的头指针指向第一个数据,tail_loca为缓冲区的尾指针,指向最末尾的数据的下一个位置. 在对缓冲区进行变动性的操作的时候,使用POSIX的互斥锁机制控制访问,解决多个线程间同时访问可能存在的竞争条件.2.3 同步控制算法设计2.3.1 发送部分同步控制主要存在于发送部分的采集、编码、打包以及接收部分的解包、解码、播放过程中. 在分离采集到音视频数据后,按照同步数据节点的格式存储,插入到采集模块的原始数据环形缓冲区中,这个过程如图4所示.编码打包模块从环形缓冲队列中依次读取同步结构体,同时,分别使用F F M P E G对视频进行H.264编码,对音频使用G.729算法编码,在编码完成后按照同步结构体的格式填充,同样存入编码数据环形缓冲队列等待打成RTP包进行发送.打包模块从编码数据环形缓冲队列中读入同步结构体,对音视频数据进行RTP打包. 由于MTU限制,而一帧视频数据可能超过这个限制,因此,需要对于这种情况进行处理. 如果RTP包超过了MTU的限制,那么,将这个RTP包分为若干个子包,同时,在这些子包中均存有同步数据结构中的时间戳字段T syncblock,以及RTP时间戳字段T tsrtp. 在后续接收端将通过T syncblock字段来判断子包属于哪个同步数据节点. 而一个同步数据节点中存在多个视频帧,这里要用到R T P包头的时标S e q u e n c e N u m b e r字段. Sequence Number字段指明该包中第一个三位二进制数据的采样时间.2.3.2 接收部分当RTP包到达接收端,解码模块从接收缓冲区中取出同步结构体. 从得到的数据中提取出三元组图 3 同步数据节点结构图Fig.3 The structure of synchronization data node图 4 同步数据采集过程Fig.4 The capturing of synchronous data60广东工业大学学报第 34 卷<T syncblock,T tsrtp,N SequnceNumber>,T syncblock表明该RTP包从属的同步结构体,T tsrtp表明这个包的帧归属,也就是说如果是一个子包的话,子包将通过这个时间戳能定位到自己属于哪一帧,N SequnceNumber确定属于同一帧内的不同的子包之间的顺序. 此时,判定该包是否为子包或者为一个完整包. 如果是一个完整的包,那么直接将其中的数据插入到如图3所示的同步数据节点中;如果是一个子包,那么根据N SequnceNumber依次将子包中的数据插入到链表中.接收部分接收到数据包后,要识别两个时间戳:同步数据块时间戳和RTP时间戳. 根据同步数据块时间戳确定该数据包是属于哪一块同步数据块,再确定该数据包是属于分包还是独立数据包. 如果是分包则根据RTP时间戳规则插入到同步数据块中的视频数据列表中,再根据序列号Sequence Number将数据包插入到该列表的相应位置;如果是独立数据包,那么根据RTP时间戳将数据包插入到同步数据块中的相应位置,具体步骤如图5所示.逐个访问缓冲区中的同步数据节点,其中有区分音频和视频的数据字段,通过这个字段开始对数据节点中的数据进行对应的音频或者视频解码. 如图6所示,将解码缓冲区中的节点取出并完成对应的解码之后,再次将其存入同步数据节点中,最后插入待播放缓冲区中,等待后面进行访问和同步控制播放. 播放模块从播放缓冲区中取出的同步数据节点已经在时间上具有强相关性,取出后直接按照音视频数据自带的时间顺序进行播放就可以完成整个过程的音视频同步.3 Android平台上基于FFMPEG实现音视频解码以及同步播放在工程实践中,Android系统使用StageFright作为多媒体框架. 但是Android系统对于音视频格式以及封装格式的支持不够丰富. 而开源项目FFMPEG 能够支持几乎所有的格式. 将FFMPEG应用在Android平台主要有两种方案. 第一种是把FFMPEG 中的解码器加入到Stagefright框架中. 这种方式的软解码效率较Android自带的软解码效率高,而且在应用层编程接口可以统一使用,但必须要修改系统源码,不适合作为应用开发者使用. 第二种是使用Native Development Kit交叉编译FFMPEG,同时使能FFMPEG自带的Android硬解码支持库libstagefright,再在应用开发过程中通过编写JNI接口代码实现调用. 这种方法不用修改系统源代码,更适合于应用开发者,本文也采用这种方式.在Ubuntu14.04下使用Google官方提供的NDK-r9d工具集,并且对FFMPEG2.5进行移植. 移植的步骤如下:(1) 根据移植的目标平台编写配置configure文件,特别注意加入对stagefright的支持.(2) 使用make工具进行构建,交叉编译生成需要的库,主要有如表1所示,抽取这些库和相关的头文件用于Android项目中.图 5 拼接成同步数据节点的过程Fig.5 The filling of synchronization node第 4 期曾碧,等:一种基于FFMPEG的音视频同步算法61在Android平台上调用FFMPEG进行解码的流程与在其他平台上进行解码播放的流程相同[13]. 在Android 应用程序中创建一个线程,先接收从对端传来的数据包,然后调用编写的JNI代码接口对接收到的数据进行解码,由于Android中只有主线程能更新UI,通过Handler通知主线程来显示解码后的图像数据.4 实验与分析音视频同步性能的客观评价准则通常是使用同步相位失真SPD(Synchronization Phase Distortion)来进行[14]. 其数学表达式为公式中的D av是音频和视频流中的两个在时间上具有强相关性且最邻近的帧i和j之间的同步相位失真(SPD),P a(i)和G a(i)分别是音频流中第i帧数据单元的播放时刻和产生时刻,相应地,P v(j)和G v(j)分别是视频流中第j帧数据单元的播放时刻和产生时刻. SPD从客观的角度反映了在时间上具有相关性的音频和视频数据之间的失同步程度.为了对文中提出的音视频同步控制算法进行实验,搭建了如表2所示的实验环境.在实验过程中进行两组实验,在PC端通过Linux下的Video For Linux框架采集视频,设置视频的分辨率,经FFMPEG指定进行H.264编码并设置视频的码率.并进行音频采样,采样后同样经FFMPEG用G.729编码器编码并指定码率. 其中两组实验参数如表3所示.按照表3中的参数对两组实验中采集的120帧视频和80帧音频数据用文中方法进行传输. 同时,为了验证文中方法对于整个过程的同步控制效果,使用一组仅在播放过程中进行音视频同步控制的实验数据作为参考.图 6 解码同步数据节点Fig.6 The decoding of synchronous data block表 1 移植的FFMPEG的动态链接库列表Tab.1 The list of FFMPEG libs cross-compiled for Android动态链接库名称功能描述libavutil辅助工具库libswresample音频数据重采样以及采样格式转换等libavcodec 提供一个通用的编解码框架和大量的多媒体数据编解码器libavformat 提供一个通用的复用和解复用框架和大量的复用和解复用器libswscale图像缩放、颜色空间转换像素格式转换等libavfilter提供一个通用的过滤器框架以及大量的过滤器等libavdevice提供通用框架从输入设备捕获数据渲染数据到输出设备表 2 实验环境Tab.2 Experimental environment软件版本号系统主频FFMPEG 2.8.1——Android终端 5.1四核1.3 GHz UBUNTU桌面系统14.04Intel I7四核2.4 GHz表 3 两组实验参数Tab.3 Experimental environment编号视频码率/(kb·s-1)视频帧率/fps视频分辨率音频码率/(kb·s-1)音频帧率/fps音频分辨率/kHz-16 bit 150025320 × 240161008240030640 × 48016100862广东工业大学学报第 34 卷如图7所示,受多个导致失同步的因素的影响,在仅对播放过程采用时间戳进行简单的同步控制的这一组中,SPD 单帧存在失同步情况明显,有时甚至接近200 m s ,失同步幅度较大;图8中是用L Bertoglio [15]的方法得到的实验结果,其中存在SPD 超过100 ms 的情况,而文中提出的方法的实验结果如图9和图10所示,能很好地控制在[-40 ms ,+40 ms]区间内,且较为稳定,经计算分析得出SPD 平均值相比于仅在播放时使用简单的同步控制的方式下的平均值要减小42.573 1 ms. 薛彬等[16]提出的改进方法的实验结果为SPD 平均减小30.197 2 ms ,如图11所示,相比之下本文的同步方法更优,同时,本文的SPD 的整体值的波动范围也要比其更小.5 结论随着移动互联网的快速发展,移动智能终端的计算能力越来越快,将在日常生活中承担更加重要的角色. 本文提出的音视频同步方案适用于以Android 智能终端为客户端的移动视频监控系统. 通过移植多媒体开源项目FFMPEG 到Android 平台,大大丰富了Android 平台对于音视频编码格式以及封装格式的支持. 同时,经过测试与验证,该同步算法能够保证音视频的同步播放,提高了监控系统的服务质量,而且对于工程实践具有很好的参考价值.参考文献:柴若楠, 曾文献, 张鹏云. 音视频同步技术综述[J]. 计算机系统应用, 2011, 20(11): 223-226.CHAI R N, ZENG W X, ZHANG P Y. Survey on audio and[ 1 ]图 10 使用本文同步控制方法的第二组SPD Fig.10 The SPD of the method proposed by this paper图 11 参考文献16中的方法的实验结果SPDFig.11 The SPD of the method proposed in 16th referencedocumentation图 7 仅使用播放同步控制方法的SPD Fig.7 The SPD of simple synchronization method图 8 L Bertoglio 方法的SPD Fig.8 The SPD of L Bertoglio method图 9 使用本文同步控制方法的第一组SPD Fig.9 The SPD of the method proposed by this paper第 4 期曾碧,等:一种基于FFMPEG 的音视频同步算法63video synchronization [J]. Computer Systems & Applica-tions, 2011, 20(11): 223-226.RADHAKRISHNAN R, TERRY K, BAUER C. Audio andvideo signatures for synchronization [C]// Multimedia and Expo, 2008 IEEE International Conference on. Hanover:IEEE, 2008: 1549-1552.[ 2 ]ESCOBAR J, DEUTSCH D, PATRIDGE C. Flow syn-chronization protocol [C]//Global Telecommunications Con-ference, 1992. Conference Record. GLOBECOM '92. Com-munication for Global Users., IEEE. Orlando, FL: IEEE,1992: 111-121.[ 3 ]RANGAN P V, RAMANATHAN S, VIN H M, et al . Tech-niques for multimedia synchronization in network file sys-tems [J]. Computer Communications, 1993, 16(3): 168-176.[ 4 ]KUO C C, CHEN M S, CHEN J C. An adaptive transmis-sion scheme for audio and video synchronization based on real-time transport protocol [C]//Multimedia and Expo,2001. ICME 2001. IEEE International Conference on.Tokyo, Japan: IEEE, 2001: 403-406.[ 5 ]ZHANG J F, LI Y, WEI Y N. Using timestamp to realize au-dio-video synchronization in real-time streaming media transmission [C]//Proceedings of the2008 IEEE Internation-al Conference on Audio, Language and Image Processing.Shanghai: IEEE Press, 2008: 1073-1076.[ 6 ]PALACHARLA S, KARMOUCH A, MAHMOUD S A.Design and implementation of a real-time multimedia presentation system using RTP [C]//2012 IEEE 36th Annual Computer Software and Applications Conference. IEEE Computer Society, 1997: 376-381.[ 7 ]AGGARWAL S, JINDALA. Comprehensive overview ofvarious lip synchronization techniques [C]. Proceedings of the2008 IEEE International Symposium on Biometrics and Security Technologies. Washington, DC : IEEE Press, 2008:1-6.[ 8 ]曾碧, 林建浩, 肖红, 等. 基于可变码长的音视频同步编码改进算法[J]. 计算机应用, 2014, 34(5): 1467-1472.ZENG B, LIN J H, XIAO H, et al . Improved algorithm of[ 9 ]audio-video synchronization coding based on variable code length [J]. Journal of Computer Science, 2014, 34(5): 1467-1472.李晓妮, 陈贺新, 陈绵书, 等. 基于H.264运动估计的音视频同步编码技术[J]. 吉林大学学报(工学版), 2012, 42(5):1321-1326.LI X N, CHEN H X, CHEN M S, et al . Audio-video syn-chronous coding based on motion estimation in H.264 [J].Journal of Jilin University (Engineering and Technology Edition), 2012, 42(5): 1321-1326.[10]温洁嫦. 数字音频信号的水印隐藏与嵌入算法[J]. 广东工业大学学报, 2008, 25(3): 51-54.WEN J C. Hidden and embedded water marking algorithm for digital audio signals [J]. Journal of Guangdong Uni-versity of Technology, 2008, 25(3): 51-54.[11]ITU-R BT. 1359-1. Relative timing of sound and vision forbroadcasting [S]. 1998.[12]刘丽霞, 边金松, 张琍, 等. 基于FFMPEG 解码的音视频同步实现[J]. 计算机工程与设计, 2013, 34(6): 2087-2092.LIU L X, BIAN J S, ZHANG L, et al . Synchronization play-ing of audio and video based on FFMPEG [J]. Computer En-gineering and Design, 2013, 34(6): 2087-2092.[13]张昕, 吕凝, 王春雷, 等. 多媒体同步传输方法研究[J]. 吉林大学学报(信息科学版), 2009, 27(6): 573-578.ZHANG X, LYU N, WANG C L, et al . Transmission meth-od of audio and video synchronization [J]. Journal of Jilin University (Information Science Edition), 2009, 27(6): 573-578.[14]BERTOGLIO L, LEONARDI R, MIGLIORATI P. Interme-dia synchronization for videoconference over IP [J]. Signal Processing: Image Communication, 1999, 15(1): 149-164.[15]薛彬, 徐京, 王猛. 一种改进的基于时间戳的空间音视频同步方法[J]. 电子设计工程, 2013, 21(11): 88-93.XUE B, XU J, WANG M. An improved audio-video syn-chronization method based on timestamp [J]. Electronic Design Engineering, 2013, 21(11): 88-93.[16]64广 东 工 业 大 学 学 报第 34 卷。
ffmpeg播放器实现详解-视频同步控制
ffmpeg播放器实现详解-视频同步控制ffplay是ffmpeg源码中⼀个⾃带的开源播放器实例,同时⽀持本地视频⽂件的播放以及在线流媒体播放,功能⾮常强⼤。
FFplay: FFplay is a very simple and portable media player using the FFmpeg libraries and the SDL library. It is mostly used as atestbed for the various FFmpeg APIs.ffplay中的代码充分调⽤了ffmpeg中的函数库,因此,想学习ffmpeg的使⽤,或基于ffmpeg开发⼀个⾃⼰的播放器,ffplay都是⼀个很好的切⼊点。
由于ffmpeg本⾝的开发⽂档⽐较少,且ffplay播放器源码的实现相对复杂,除了基础的ffmpeg组件调⽤外,还包含视频帧的渲染、⾳频帧的播放、⾳视频同步策略及线程调度等问题。
因此,这⾥我们以ffmpeg官⽹推荐的⼀个ffplay播放器简化版本的开发例程为基础,在此基础上循序渐进由浅⼊深,最终探讨实现⼀个视频播放器的完整逻辑。
在上篇⽂章中,我们讨论了⼀个播放器的基础架构,梳理了组成播放器的基本组件及后台数据队列,并对代码结构进⾏了调整。
本⽂在上篇⽂章的基础上,讨论⾳视频同步的相关内容,⾸先介绍与⾳视频同步相关的时间戳概念,然后介绍⾳视频同步涉及的原理及策略,最后重点讲述关键代码的实现过程。
公众号:断点实验室⾳视频开发系列⽂章1、时间戳时间戳的概念贯穿⾳视频开发始终,重要性不⾔⽽喻。
时间戳告诉我们在什么时候,⽤多快的速度去播哪⼀帧,其中,DTS(decoding timestamp)告诉我们何时解码,PTS(presentation timestamp)告诉我们何时播放。
那么,为什么要有DTS和PTS?⾸先需要理解编码后的数据是如何存储的。
1.1 帧分组(Group of picture)视频帧(这⾥主要以H.264编码为例)以序列为单位进⾏组织,⼀个序列是⼀段图像编码后的数据流,从关键帧I帧开始,包含了与组内I帧相关联的P 帧和B帧,到下⼀个I帧结束,⼀个序列为⼀个帧组(group of picture),如下图所⽰。
android的ffmpeg原理
android的ffmpeg原理Android的ffmpeg原理1. 什么是ffmpeg•FFmpeg是一套开源免费的音视频处理工具集合,可以进行音视频的编解码、转码、格式转换、流媒体处理等。
•它由一些用C语言编写的库和工具组成,是目前应用最广泛的音视频开源项目之一。
2. ffmpeg的应用场景•视频转码:将视频从一种格式转换为另一种格式,如将MP4视频转换为AVI格式。
•音视频解码:将编码后的音视频文件解码成原始的音频流和视频流。
•音视频编码:将原始的音频流和视频流编码为特定格式的音视频文件。
•视频剪辑:提取视频指定片段,或将多个视频拼接成一个。
•音视频处理:包括添加水印、调整画面亮度、对声音进行降噪等操作。
3. ffmpeg的原理音视频编解码原理•音视频编解码需要使用特定的编码器和解码器。
•编码器负责将原始音视频数据编码为指定格式的数据,如编码器将视频流编码为格式。
•解码器则负责将编码后的音视频数据解码为原始数据。
•ffmpeg中集成了许多常见的音视频编解码器,可以处理多种不同格式的音视频文件。
音视频流处理原理•ffmpeg可以通过读取和写入音视频流的方式进行处理。
•音视频流可以是来自文件、摄像头、网络等来源。
•输入音视频流经过解码器解码后,得到原始的音频流和视频流。
•处理后的原始数据可以经过编码器编码,再写入到文件、网络等输出源。
应用于Android的ffmpeg•在Android平台上,可以通过在JNI层调用ffmpeg库的方式来使用其功能。
•JNI(Java Native Interface)是Java提供的一种机制,可以实现Java和本地C/C++代码的相互调用。
•通过JNI调用ffmpeg库,可以在Android应用中使用ffmpeg的功能,例如进行视频转码、音频解码等操作。
4. 使用ffmpeg的步骤1.引入ffmpeg库:在Android项目中引入ffmpeg库文件,并配置相应的依赖关系。
ijkplayer原理
ijkplayer原理IJKPlayer是一款基于FFmpeg的开源媒体播放器,常用于安卓平台上的音视频播放。
本文将介绍IJKPlayer的原理,并深入探讨其具体实现方式。
IJKPlayer的核心是FFmpeg,它是一个跨平台的音视频解码器库。
FFmpeg提供了丰富的音视频编解码器、过滤器和工具,可以实现各种媒体处理和播放功能。
IJKPlayer在FFmpeg的基础上构建了更加简洁易用的API,并提供了更好的兼容性和性能优化。
IJKPlayer的播放流程可以分为几个主要步骤:初始化、解码、渲染和控制。
首先,在初始化阶段,IJKPlayer会创建一个FFmpeg的上下文,并设置相关的回调函数,用于存储和处理解码后的数据。
接下来,IJKPlayer会通过FFmpeg的API打开媒体文件,并读取文件的相关信息,如编码器、码率、时长等。
然后,IJKPlayer会根据需要选择合适的解码器,并对音视频数据进行解码。
在解码阶段,IJKPlayer会从媒体文件中读取音视频数据包,并将其送入解码器进行解码。
解码器会将压缩的音频或视频数据解压成原始的音频或视频帧。
IJKPlayer会根据解码后的数据的时间戳进行帧同步,保证音视频的同步播放效果。
同时,IJKPlayer会对音频数据进行重采样处理,以适应不同的输出设备和要求。
解码后的视频帧会送入渲染器进行显示,而解码后的音频帧会送入音频播放器进行播放。
在渲染阶段,IJKPlayer使用OpenGL ES或Android原生的SurfaceView进行视频帧的渲染。
对于音频播放,IJKPlayer使用OpenSL ES或Android原生的AudioTrack进行音频输出。
最后,在控制阶段,IJKPlayer提供了一系列的API用于对播放进行控制,比如播放、暂停、快进、音量调整等。
同时,IJKPlayer还支持媒体播放器的回调函数,用于监听播放状态的变化,比如播放完成、发生错误等。
FFMPEG教程06指导6:同步音频
同步音频现在我们已经有了一个比较像样的播放器。
所以让我们看一下还有哪些零碎的东西没处理。
上次,我们掩饰了一点同步问题,也就是同步音频到视频而不是其它的同步方式。
我们将采用和视频一样的方式:做一个内部视频时钟来记录视频线程播放了多久,然后同步音频到上面去。
后面我们也来看一下如何推而广之把音频和视频都同步到外部时钟。
生成一个视频时钟现在我们要生成一个类似于上次我们的声音时钟的视频时钟:一个给出当前视频播放时间的内部值。
开始,你可能会想这和使用上一帧的时间戳来更新定时器一样简单。
但是,不要忘了视频帧之间的时间间隔是很长的,以毫秒为计量的。
解决办法是跟踪另外一个值:我们在设置上一帧时间戳的时候的时间值。
于是当前视频时间值就是PTS_of_last_frame + (current_time - time_elapsed_since_PTS_value_was_set)。
这种解决方式与我们在函数get_audio_clock中的方式很类似。
所在在我们的大结构体中,我们将放上一个双精度浮点变量video_current_pts和一个64位宽整型变量不要忘记在stream_component_open函数中初始化它:现在我们需要一种得到信息的方式:提取时钟但是为什么要强制使用视频时钟呢?我们更改视频同步代码以致于音频和视频不会试着去相互同步。
想像一下我们让它像ffplay一样有一个命令行参数。
所以让我们抽象一样这件事情:我们将做一个新的封装函数get_master_clock,用来检测av_sync_type变量然后决定调用get_audio_clock还是get_video_clock 或者其它的想使用的获得时钟的函数。
我们甚至可以使用电脑时钟,这个函数我们叫做同步音频现在是最难的部分:同步音频到视频时钟。
我们的策略是测量声音的位置,把它与视频时间比较然后算出我们需要修正多少的样本数,也就是说:我们是否需要通过丢弃样本的方式来加速播放还是需要通过插值样本的方式来放慢播放?我们将在每次处理声音样本的时候运行一个synchronize_audio的函数来正确的收缩或者扩展声音样本。
FFmpeg入门详解——音视频原理及应用
2
流程
3 8.3 I/P/B帧
技术详细讲解
4 8.4运动估计
和运动补偿
5 8.5音频编码
技术与流程
8.3.1 I/P/B帧编解码技术 8.3.2 I/P/B帧的特点 8.3.3 I/P/B帧的基本流程 8.3.4帧内与帧间编码 8.3.5帧内编码流程 8.3.6块与宏块
8.5.1 MPEG-1音频编码 8.5.2 MPEG-2音频编码 8.5.3 MPEG-4音频编码 8.5.4 AC-3音频编码
6.5.1 I/P/B/IDR帧 6.5.2 GOP详细讲解 6.5.3 DTS和PTS详细讲解
7.1视频编码原理 7.2视频采集原理
7.3音频编码原理 7.4视频编码标准
7.4.1 ITU/ISO/JVT 7.4.2 MPEG-x系列 7.4.3 H.26x系列
8.1视频编码
1
简介
8.2视频编码
4.1音频基础概念
4.3音频深度学习
4.1.1声音和音频 4.1.2数字音频 4.1.3音频采集 4.1.4音频处理 4.1.5音频使用场景及应用 4.1.6音频格式 4.1.7混音技术 4.1.8音频重采样
4.2.1音频压缩 4.2.2音频编码 4.2.3音频编码基本手段 4.2.4音频编码算法
6.1音视频压缩编 码
6.3压缩编码关键 技术
6.4帧内编码 与帧间编码
6.5 GOP与 DTS/PTS
6.2.1无损压缩 6.2.2有损压缩
6.3.1预测编码 6.3.2变换 6.3.3量化 6.3.4熵编码
6.4.1帧内编码 6.4.2帧间编码 6.4.3运动矢量 6.4.4运动补偿 6.4.5双向预测
FFmpeg入门详解——音视频原理 及应用
基于Android系统的FFmpeg多媒体同步传输算法研究
基于Android系统的FFmpeg多媒体 同步传输算法研究胡成任平安李文莉陕西师范大学计算机科学学院,陕西西安710062摘要:FFmpeg是一个开源跨平台多媒体数据解决方案,常被移植到各种嵌入式系统中。
将FFmpeg移植到Android系统中,能够增加Android系统对编解码格式标准的支持,但由于目前手机处理能力低,内存小等硬件配置因素,严重影响FFFmpeg对音视频流的解码效率,导致解码出的音视频数据无法同步。
通过研究基于时间戳的多媒体音视频同步算法模型,将其引入到FFmpeg中,并在Android平台进行算法实验。
实验证明,基于时间戳多媒体音视频同步算法模型能够有效地保证多媒体数据的同步。
FFmpeg;多媒体;时间戳;音视频同步;AndroidTP301.6A1673-629X(2011)10-0085-03FFmpeg Multimedia System Based on Android Synchronous Transmission AlgorithmHU ChengREN Ping-anLI Wen-li2011-03-112011-06-22国家自然科学基金(61070189)作者简介:胡成(1983-),男,硕士研究生,主要研究方向为信息安全以及多媒体技术;任平安,副教授,硕士生导师,主要研究领域为信息安全。
用该PTS@@[1] 吴张顺,张询.基于FFmpeg的视频编码存储研究与实现 [J].杭州电子科技大学学报,2006,26(3):30-34.@@[2] 高焕堂.Google Android应用框架原理与程序设计36技 [M].台北:广悦文化,2008:23-25.@@[3]李笑佳,周兵,李晓强,等.视频重演中的同步技术[J]. 计算机工程,2005,31 (2):64-66.@@[4]张维明,吴玲达,老松杨.多媒体信息系统[M].北京:电子 工业出版社,2002.@@[5]吴炜,常义林.一种MPEG 2媒体同步控制算法[J].系 统工程与电子技术,2005,27(1):173-177.@@[6] 许延,常义林,刘增基.多媒体同步技术研究[J].西安电 子科技大学学报:自然科学版,2000,27(4):504-509.@@[7]王少燕.多媒体通信中的音视频同步问题研究与实现 [D].西安:西安电子科技大学,2003.@@[8]鲁萍,马光四.多媒体数据流实时传输速率研究及应用 [D].西安:西安建筑科技大学,2005.@@[9] Moving Pictures Expert Group. MPEG-2 TextModel 5. DocI SO/IEC JTC1/SC29/WG11/N0400[ S]. 1993.@@[10] Fibush D. Timing and Synchronization Using MPEG-2 Trans port Streams[J]. SMPIE Journal.1996(7) :395-405.@@[11]求是科技Vc++音视频编解码技术及实践[M].北京:人 民邮电出版社,2006.@@[12]陈芳,沈晓军,陈洁.多媒体同步技术的研究[J].北京 工业大学学报,1996,22(4):110-114.@@[13]程文青,陈云鹤,徐晶.一种适用于嵌入式媒体播放器的 音视频同步方法[J].计算机与数字工程,2007,35(2):161 -163.@@[14]吴进,贺辉,洪辉.多媒体数据流实时传输技术的研 究[J].通信技术,2009,42(1):342-344.@@[15]刘芳.基于时间轴模型的音视频同步的研究与实现 [D].南京:暨南大学,2008.@@[16] ZHANG Wei-ming,WU Ling-da,LAO Song-yang. Multime dia Informtion System [ M ]. Beijing : Publishing House of Elec tronic Industry,2002.@@[1] Admin. OGRE图象引擎介绍[EB/OL]. 2010-06. http:// www. azure. eom. cn/defauh. asp.@@[2]白建军,朱亚军,梁辉,等.OpenGL三维图形设计与制作 [M].北京:清华大学出版社,1998:378-391.@@[3]鲁萌,刘建波.三维地形显示中数据缓存与调度算法研 究[J].微计算机信息,2010,4(1):210-212.@@[4]杨子华,刘宏芳.基于粒子系统模型的自然景物生成技术 应用研究[J].计算技术与自动化,1998,17(3):20-23.@@[5]王宏炜,刘越,王涌天.面向对象的通用粒子系统设计 [J].系统仿真学报,2006,18(1):46-48.@@[ 6 ] Reeves W T,Blau R. Approximate and probabilistic algorithms forshading and rending structured particle system [ J ]. Comput er Graphics, 1985,19 (3) :313 -322.@@[7]张尚华.烟花燃放效果的仿真研究[D].广州:中山大学计 算机与信息学院,2006.@@[8] Steven P,Reiss. An Engine for the 3D Visualization of Pro gram Information[ J ]. Journal of Visual Languages & Compu ting, 1995,6 ( 3 ) : 127-129.@@[9]张璞,陶丽娜.基于OpenGL的岩石楔形体边坡三维分 析系统[J].计算机技术与发展,2009,19(3):53-56.@@[10]张巧芳,李光耀.基于单幅图像的三维浏览图生成算:法 [J].计算机技术与发展,2010,20(1):43-47.@@[ 11] Brundy A L,Saltzman D H,Emerson D,et al. Sonographic fea tures associated with cleft palate [ J ]. Clin Ultrasound, 1986, 14 : 486-489.@@[ 12] Monni G, Ibba RM,Olla G, et al. Colour Doppler Ultrasound and prenatal diagnosis of cleft palate [ J ]. Clin Ultrasound, 1995,23 : 189 - 192.。
基于FFMPEG解码的音视频同步实现
L I U Li — x i a ,B I AN J i n - s o n g,Z HANG Li ,M U S e n
( I n s t i t u t e 7 0 6 ,S e c o n d Ac a d e my o f C h i n a Ae r o s p a c e S c i e n c e a n d I n d u s t r y C o r p o r a t i o n , B e i j i n g 1 0 0 8 5 4 , C h i n a )
Ab s t r a c t : To s y nc h r o n i z e t h e p l a y b a c k o f a u d i o a n d v i d e o,b a s e d o n t h e s i t u a t i o n t h a t t h e a u d i o a n d v i d e o a r e a c q u i r e d a t t h e s a me t i me ,b u t i n d e p e n d e n t o f b e i n g e n c o d e d o r s t o r e d,a n e w me t h o d o f t i me s t a mp i s p r o p o s e d .I t i s t h a t a u d i o p l a y b a c k c l o c k i s u s e d a s s y n c h r o n o u s c l o c k a n d F FM P EG i s u s e d t O d e c o d e t h e a u d i o a n d v i d e o d a t a s e p a r a t e l y .Th e n t h e a u d i o p l a y b a c k c l o c k wh i c h i s c o mp u t e d b y t h e d e c o d e d t i me s t a mp i s u s e d a s s y n c h r o n o u s c l o c k . Vi d e o p l a y b a c k s p e e d i s c o n t r o l l e d b y a u d i o p l a y b a c k c l o c k . Th e me t h o d c a n g u a r a n t e e t h e a u d i o a n d v i d e o t o p l a y s mo o t h l y ,wi t h o u t l a g a n d d e l a y .Fi n a l l y t h e e x p e r i me n t a l r e s u l t s p r o v e t h e t i me s t a mp s nc y h r o n i z a t i o n me t h o d p r o p o s e d i s e f f e c t i v e .
ffmpeg rtp解析原理
ffmpeg rtp解析原理FFmpeg是一个开源的跨平台音视频处理工具,它可以用来录制、转换和流媒体音视频内容。
其中,RTP(Real-time Transport Protocol)是一种用于实时数据传输的协议,常用于音视频流的传输。
本文将介绍FFmpeg中的RTP解析原理。
RTP是一种面向实时数据传输的协议,它通常用于音视频流的传输。
在FFmpeg中,RTP解析是指将从网络中接收到的RTP数据包进行解析,提取出其中的音视频数据,并进行相应的处理和解码。
RTP数据包中包含了音视频数据以及与之相关的时间戳、序列号等信息。
在FFmpeg中,RTP解析主要涉及到以下几个方面:1. 数据包接收,FFmpeg通过网络接收RTP数据包,通常使用UDP协议进行数据传输。
接收到的数据包包含了音视频数据以及相关的控制信息。
2. 数据包解析,接收到的RTP数据包需要进行解析,提取出其中的音视频数据以及相关的时间戳、序列号等信息。
这些信息对于后续的音视频处理和同步非常重要。
3. 数据处理,解析出的音视频数据需要进行相应的处理,如解码、转换等操作。
FFmpeg提供了丰富的音视频处理功能,可以对解析出的数据进行各种处理。
4. 数据同步,RTP数据包中包含了时间戳等信息,通过这些信息可以实现音视频数据的同步播放。
FFmpeg可以根据时间戳等信息对音视频数据进行同步处理,保证音视频的正常播放。
总的来说,FFmpeg中的RTP解析原理涉及到数据包接收、解析、处理和同步等多个方面,通过这些步骤可以实现对RTP数据包的解析和音视频数据的处理。
这为实时音视频流的处理和播放提供了重要的技术支持。
音视频同步原理
音视频同步原理音视频同步是指在播放音频和视频时,保持二者之间的时间同步,使得观看者可以同时听到声音和看到对应的画面。
在现代的多媒体应用中,音视频同步是非常重要的,它直接影响到用户的观感和体验。
那么,究竟是如何实现音视频同步的呢?接下来,我们将深入探讨音视频同步的原理。
首先,音视频同步的实现主要依赖于时间戳。
在音频和视频文件中,都会包含有时间戳信息,用来标识每一帧的播放时间。
当播放器读取音频和视频文件时,会根据时间戳来决定何时播放音频和视频帧,从而实现同步播放。
其次,音视频同步还依赖于硬件设备的支持。
在计算机或移动设备中,音频和视频的播放通常由不同的硬件模块来实现,比如音频芯片和视频解码器。
这些硬件模块会根据时间戳来同步播放音频和视频,确保二者之间的同步性。
另外,网络传输也是影响音视频同步的重要因素。
在网络传输过程中,音频和视频数据可能会因为网络延迟、丢包等原因而出现不同步的情况。
为了解决这个问题,通常会采用缓冲区来对音频和视频数据进行缓存,以确保二者在播放时能够保持同步。
此外,音视频编解码算法也对同步起着重要作用。
在音视频文件的编解码过程中,需要对音频和视频数据进行压缩和解压缩处理,这可能会引入一定的时间延迟。
为了保持同步,需要在编解码算法中进行一定的优化和调整,以确保音频和视频的时间同步性。
最后,还有一些特殊情况需要考虑,比如用户可能会在播放过程中进行快进、快退、暂停等操作,这可能会对音视频同步造成影响。
为了解决这个问题,播放器通常会采用一些特殊的算法来处理用户操作,以确保音视频能够在用户操作后尽快恢复同步。
综上所述,音视频同步是通过时间戳、硬件支持、网络传输、编解码算法以及用户操作等多种因素共同作用下实现的。
只有这些因素能够协同工作,才能保证音视频的同步播放。
在未来,随着技术的不断发展,我们相信会有更多更好的方法来实现音视频同步,为用户带来更好的观感和体验。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
视频流中的DTS/PTS到底是什么?
DTS(解码时间戳)和PTS(显示时间戳)分别是解码器进行解码和显示帧时相对于SCR(系统参考)的时间戳。
SCR可以理解为解码器应该开始从磁盘读取数据时的时间。
mpeg文件中的每一个包都有一个SCR时间戳并且这个时间戳就是读取这个数据包时的系统时间。
通常情况下,解码器会在它开始读取mpeg流时启动系统时钟(系统时钟的初始值是第一个数据包的SCR值,通常为0但也可以不从0开始)。
DTS 时间戳决定了解码器在SCR时间等于DTS时间时进行解码,PTS时间戳也是类似的。
通常,DTS/PTS时间戳指示的是晚于音视频包中的SCR的一个时间。
例如,如果一个视频数据包的SCR是100ms(意味着此包是播放100ms以后从磁盘中读取的),那么DTS/PTS值就差不多是200 /280ms,表明当SCR到200ms时这个视频数据应该被解码并在80ms以后被显示出来(视频数据在一个buffer中一直保存到开始解码)下溢通常发生在设置的视频数据流相关mux率太高。
如果mux率是1000000bits/sec(意味着解码器要以1000000bits/sec的速率读取文件),可是视频速率是2000000bits/sec(意味着需要以2000000bits/sec的速率显示视频数据),从磁盘中读取视频数据时速度不够快以至于1秒钟内不能够读取足够的视频数据。
这种情况下DTS/PTS时间戳就会指示视频在从硬盘中读出来之前进行解码或显示(DTS/PTS时间戳就要比包含它们的数据包中的SCR时间要早了)。
如今依靠解码器,这基本已经不是什么问题了(尽管MPEG文件因为应该没有下溢而并不完全符合MPEG标准)。
一些解码器(很多著名的基于PC的播放器)尽可能快的读取文件以便显示视频,可以的话直接忽略SCR。
注意在你提供的列表中,平均的视频流速率为~3Mbps(3000000bits/sec)但是它的峰值达到了14Mbps(相当大,DVD限制在9.8Mbps内)。
这意味着mux率需要调整足够大以处理14Mbps的部分,bbMPEG计算出来的mux率有时候太低而导致下溢。
你计划让视频流速率这么高么?这已经超过了DVD的说明了,而且很可能在大多数独立播放其中都不能播放。
如果你不是这么计划,我会从1增加mquant的值并且在视频设置中将最大码流设置为9Mbps以保持一个小一点的码流。
如果你确实想让视频码率那么高,你需要增大mux率。
从提供的列表可以得出bbMPEG 使用14706800bits/sec或者1838350bytes /sec的mux率(总数据速率为:1838350bytes/sec (14706800bits/sec)行)。
你在强制mux率字段设置的值应该是以bytes/sec为单位并被50整除。
所以我会从36767(1838350/50)开始,一直增加直到不会再出现下溢错误为止。
音视频同步原理[ffmpeg]
ffmpeg对视频文件进行解码的大致流程:
1. 注册所有容器格式和CODEC: av_register_all()
2. 打开文件: av_open_input_file()
3. 从文件中提取流信息: av_find_stream_info()
4. 穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO
5. 查找对应的解码器: avcodec_find_decoder()
6. 打开编解码器: avcodec_open()
7. 为解码帧分配内存: avcodec_alloc_frame()
8. 不停地从码流中提取中帧数据: av_read_frame()
9. 判断帧的类型,对于视频帧调用: avcodec_decode_video()
10. 解码完后,释放解码器: avcodec_close()
11. 关闭输入文件:av_close_input_file()
output_example.c 中A V同步的代码如下(我的代码有些修改),这个实现相当简单,不过挺说明问题。
音视频同步-时间戳
媒体内容在播放时,最令人头痛的就是音视频不同步。
从技术上来说,解决音视频同步问题的最佳方案就是时间戳:首先选择一个参考时钟(要求参考时钟上的时间是线性递增的);生成数据流时依据参考时钟上的时间给每个数据块都打上时间戳(一般包括开始时间和结束时间);在播放时,读取数据块上的时间戳,同时参考当前参考时钟上的时间来安排播放(如果数据块的开始时间大于当前参考时钟上的时间,则不急于播放该数据块,直到参考时钟达到数据块的开始时间;如果数据块的开始时间小于当前参考时钟上的时间,则“尽快”播放这块数据或者索性将这块数据“丢弃”,以使播放进度追上参考时钟)。
可见,避免音视频不同步现象有两个关键——一是在生成数据流时要打上正确的时间戳。
如果数据块上打的时间戳本身就有问题,那么播放时再怎么调整也于事无补。
假如,视频流内容是从0s开始的,假设10s时有人开始说话,要求配上音频流,那么音频流的起始时间应该是10s,如果时间戳从0s或其它时间开始打,则这个混合的音视频流在时间同步上本身就出了问题。
打时间戳时,视频流和音频流都是参考参考时钟的时间,而数据流之间不会发生参考关系;也就是说,视频流和音频流是通过一个中立的第三方(也就是参考时钟)来实现同步的。
第二个关键的地方,就是在播放时基于时间戳对数据流的控制,也就是对数据块早到或晚到采取不同的处理方法。
图2.8中,参考时钟时间在0-10s内播放视频流内容过程中,即使收到了音频流数据块也不能立即播放它,而必须等到参考时钟的时间达到10s 之后才可以,否则就会引起音视频不同步问题。
基于时间戳的播放过程中,仅仅对早到的或晚到的数据块进行等待或快速处理,有时候是不够的。
如果想要更加主动并且有效地调节播放性能,需要引入一个反馈机制,也就是要将当前数据流速度太快或太慢的状态反馈给“源”,让源去放慢或加快数据流的速度。
熟悉DirectShow的读者一定知道,DirectShow中的质量控制(Quality Control)就是这么一个反馈机制。
DirectShow对于音视频同步的解决方案是相当出色的。
但WMF SDK在播放时只负责将ASF数据流读出并解码,而并不负责音视频内容的最终呈现,所以它也缺少这样的一个反馈机制。
音视频同步通讯SDK源码包分享:
Android:/data/711001
Windows:/data/715497
Linux:/detail/weixiaowenrou/5169796
IOS:/data/715486
WEB:/data/710983。