ffmpeg tutorial 6 --音频同步 实践

音频同步

初步印象:播放的速度终于均匀了,不过感觉好快

话说,是按照视频同步的方案增加的函数

增加的大函数都是audio做文件名的。期望在下一轮阅读中再次分析 synchronize_audio


比较tutorial5 vs tutorial 6

结构有点乱

代码增加的大致有:

   选择同步的时钟接口函数

新添加了 double get_video_clock(VideoState *is)

 

double get_video_clock(VideoState *is) {

double delta;




delta = (av_gettime() - is->video_current_pts_time) / 1000000.0;

return is->video_current_pts + delta;

}




double get_external_clock(VideoState *is) {

return av_gettime() / 1000000.0;

}

double get_master_clock(VideoState *is) {

if(is->av_sync_type == AV_SYNC_VIDEO_MASTER) {

return get_video_clock(is);

} else if(is->av_sync_type == AV_SYNC_AUDIO_MASTER) {

return get_audio_clock(is);

} else {

return get_external_clock(is);

}

}

 

重点移植 synchronize_audio

第二是,添加了类似于尚一章同步视频的函数:同步音频,这个函数期望反复阅读
鉴于重要性,分代码展示和代码分析两端

int synchronize_audio(VideoState *is, short *samples,
		      int samples_size, double pts) {
  int n;
  double ref_clock;

  n = 2 * is->audio_st->codec->channels;
  
  if(is->av_sync_type != AV_SYNC_AUDIO_MASTER) {
    double diff, avg_diff;
    int wanted_size, min_size, max_size, nb_samples;
    
    ref_clock = get_master_clock(is);
    diff = get_audio_clock(is) - ref_clock;

    if(diff < AV_NOSYNC_THRESHOLD) {
      // accumulate the diffs
      is->audio_diff_cum = diff + is->audio_diff_avg_coef
	* is->audio_diff_cum;
      if(is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {//涉及到一个公式
	is->audio_diff_avg_count++;
      } else {
	avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);

	if(fabs(avg_diff) >= is->audio_diff_threshold) {
	  wanted_size = samples_size + ((int)(diff * is->audio_st->codec->sample_rate) * n);
	  min_size = samples_size * ((100 - SAMPLE_CORRECTION_PERCENT_MAX) / 100);
	  max_size = samples_size * ((100 + SAMPLE_CORRECTION_PERCENT_MAX) / 100);
	  if(wanted_size < min_size) {
	    wanted_size = min_size;
	  } else if (wanted_size > max_size) {
	    wanted_size = max_size;
	  }

	  if(wanted_size < samples_size) {
	    /* remove samples */
	    samples_size = wanted_size;
	  } else if(wanted_size > samples_size) {
	    uint8_t *samples_end, *q;
	    int nb;


	    /* add samples by copying final sample*/
	    nb = (samples_size - wanted_size);
	    samples_end = (uint8_t *)samples + samples_size - n;
	    q = samples_end + n;
	    while(nb > 0) {
	      memcpy(q, samples_end, n);
	      q += n;
	      nb -= n;
	    }
	    samples_size = wanted_size;
	  }
	}
      }
    } else {
      /* difference is TOO big; reset diff stuff */
      is->audio_diff_avg_count = 0;
      is->audio_diff_cum = 0;
    }
  }
  return samples_size;
}


       下面用突出 显示  展示我认为代码中的难点。

 

/* Add or subtract samples to get a better sync, return new

audio buffer size */

int synchronize_audio(VideoState *is, short *samples,

int samples_size, double pts) {

int n;

double ref_clock;


n = 2 * is->audio_st->codec->channels;

if(is->av_sync_type != AV_SYNC_AUDIO_MASTER) {

double diff, avg_diff;

int wanted_size, min_size, max_size, nb_samples;

ref_clock = get_master_clock(is);

diff = get_audio_clock(is) - ref_clock;


if(diff < AV_NOSYNC_THRESHOLD) {

// accumulate the diffs

is->audio_diff_cum = diff + is->audio_diff_avg_coef

* is->audio_diff_cum;

if(is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {//涉及到一个公式

is->audio_diff_avg_count++;

} else {

avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);

//这一个函数都是理解的难点

if(fabs(avg_diff) >= is->audio_diff_threshold) {

wanted_size = samples_size + ((int)(diff * is->audio_st->codec->sample_rate) * n);

min_size = samples_size * ((100 - SAMPLE_CORRECTION_PERCENT_MAX) / 100);

max_size = samples_size * ((100 + SAMPLE_CORRECTION_PERCENT_MAX) / 100);

if(wanted_size < min_size) {

wanted_size = min_size;

} else if (wanted_size > max_size) {

wanted_size = max_size;

}


if(wanted_size < samples_size) {

/* remove samples */

samples_size = wanted_size;

} else if(wanted_size > samples_size) {

uint8_t *samples_end, *q;

int nb;



/* add samples by copying final sample*/

nb = (samples_size - wanted_size);

samples_end = (uint8_t *)samples + samples_size - n;

q = samples_end + n;

while(nb > 0) {

memcpy(q, samples_end, n);

q += n;

nb -= n;

}

samples_size = wanted_size;

}

}

}

} else {

/* difference is TOO big; reset diff stuff */

is->audio_diff_avg_count = 0;

is->audio_diff_cum = 0;

}

}

return samples_size;

}

 

变化最大的函数之audio_callback

 

void audio_callback(void *userdata, Uint8 *stream, int len) {


VideoState *is = (VideoState *)userdata;

int len1, audio_size;

double pts;




while(len > 0) {

if(is->audio_buf_index >= is->audio_buf_size) {

/* We have already sent all our data; get more */

audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf), &pts);

if(audio_size < 0) {

/* If error, output silence */

is->audio_buf_size = 1024;

memset(is->audio_buf, 0, is->audio_buf_size);

} else {

audio_size = synchronize_audio(is, (int16_t *)is->audio_buf,

audio_size, pts);

is->audio_buf_size = audio_size;

}

is->audio_buf_index = 0;

}

len1 = is->audio_buf_size - is->audio_buf_index;

if(len1 > len)

len1 = len;

memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);

len -= len1;

stream += len1;

is->audio_buf_index += len1;

}

}


 

以上是代码,这里附带两个版本的callback函数的对比图:



可以看到终点修改的位置在解码后的处理。尤其注意红色的标示部分

对比视频同步的代码,主要在vedio_thread中。

小结看代码思路

音频的入口,就是从回调函数看起,然后看到同步的函数

对比,视频,视频就是从线程看起,并且结合主函数的刷新定时器来看。

代码实践

以下直接拿log分析:给出一次代码运行过程产生的输出,以后直接对应代码

Function: synchronize_audio(VideoState *, short *, int, double), diff=0.027000000000000000

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= 0.027000000000000000

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=0

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

//这是一轮音频get 解码播放 的过程,round 0,相同的过程将会持续到round 18,变化请看下面的注释



//省略其中重复的18个



//这是第20次音频取样播放,20是认为设定的阈值(详细见宏定义);此时计算avg_diff,【】【】其实就是执行的另外一条代码覆盖;


//并且第一次【注意,这是第一次】进入休整样本值的过程中,后续的代码执行结果:表示我们想让样本变小??

Function: synchronize_audio(VideoState *, short *, int, double), diff=-13.566370441424555

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -13.573071923920748

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, 【when】is->audio_diff_avg_count:20 >10 //

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size :-216580 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

初步印象:视频放完了,音频还没有放完。


 

表格一:audio_size synchronize_audio返回的值)

 

比较一下老代码,这个值是多还是少?

Todo:分析一下老版本的值多少?

可否从音频的波特率上分析下, 一共20个,20*480

 

Line 4: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 8: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 12: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 16: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 20: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 24: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 28: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 32: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 36: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 40: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 44: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 48: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 52: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 56: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 60: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 64: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 68: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 72: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 76: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 80: Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Line 86: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 92: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 98: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 104: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 110: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 116: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 122: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 128: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 134: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 140: Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Line 146: Function: audio_callback(void *, unsigned char *, int),auido_size= 0


 

附件:完整的log分析记录:


 

Function: synchronize_audio(VideoState *, short *, int, double), diff=0.027000000000000000

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= 0.027000000000000000

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=0

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

//这是一轮音频get 解码 播放 的过程,round 0,相同的过程将会持续到round 18,变化请看下面的注释


Function: synchronize_audio(VideoState *, short *, int, double), diff=-0.14302037207122775

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -0.14300687207122775

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=1

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-0.33604274414245550

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -0.33611424757849112

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=2

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-0.50606311621368327

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -0.50623117333747247

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=3

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-0.67608448828491097

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -0.67633760387157971

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=4

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-10.821046860356137

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -10.821385029158073

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=5

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-10.991067232427365

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -10.996477924941944

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=6

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-11.173088604498595

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -11.178586843461066

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=7

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-11.343109976569822

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -11.348699269991553

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=8

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-11.565133348641048

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -11.570807698276043

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=9

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-11.735154720712277

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -11.740940124561416

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=10

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-11.905175092783505

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -11.911045562845786

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=11

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-12.076196464854734

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -12.082151987636157

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=12

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-12.277218836925961

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -12.283259912919778

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=13

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-12.447239208997187

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -12.453380838953647

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=14

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-12.639261581068416

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -12.645488271487892

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=15

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-12.856284953139644

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -12.862607697275388

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=16

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-13.028306325210870

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -13.034737629059508

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=17

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-13.225328697282098

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -13.231846066096628

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=18

Function: audio_callback(void *, unsigned char *, int),auido_size= 480

Function: synchronize_audio(VideoState *, short *, int, double), diff=-13.396349069353327

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -13.402964992386377

Function: synchronize_audio(VideoState *, short *, int, double), audio_diff_avg_count=19

Function: audio_callback(void *, unsigned char *, int),auido_size= 480


//这是第20次音频取样播放,20是认为设定的阈值;此时计算avg_diff

//并且第一次【注意,这是第一次】进入休整样本值的过程中,后续的代码执行结果:表示我们想让样本变小??

Function: synchronize_audio(VideoState *, short *, int, double), diff=-13.566370441424555

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -13.573071923920748

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10 //

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -216580 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0


Function: synchronize_audio(VideoState *, short *, int, double), diff=-13.836396813495783

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -13.843183349457744

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -220902 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-14.106423185567010

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -14.113344777241739

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -225222 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-14.376449557638237

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -14.383506230026859

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -229542 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-14.646475929709466

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -14.653667682824478

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -233862 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-14.926503301780693

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -14.933830135622106

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -238344 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-15.196529673851920

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -15.203996588919731

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -242664 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-15.466556045923149

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -15.474158044217608

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -246984 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-15.736582417994377

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -15.744319497016486

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -251304 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-16.040610790065607

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -16.048482949814115

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -256168 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-16.310638162136833

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -16.318662403611739

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -260490 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-16.582664534208060

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -16.590823865409867

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -264842 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0

Function: synchronize_audio(VideoState *, short *, int, double), diff=-16.868691906279288

Function: synchronize_audio(VideoState *, short *, int, double), // accumulate the diffs= -16.876987318211992

Function: synchronize_audio(VideoState *, short *, int, double), avg_diff=-9.2559631349317831e+061, whenis->audio_diff_avg_count:20 >10

Function: synchronize_audio(VideoState *, short *, int, double), wanted_size < min_size -269418 < 0

Function: synchronize_audio(VideoState *, short *, int, double), /* remove samples */

Function: audio_callback(void *, unsigned char *, int),auido_size= 0


小结

算法很重要

实践很重要

结合代码覆盖学习


 



 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ffmpeg-web-pusher是一个基于FFmpeg的实用工具,用于实时将音频和视频内容推送到Web服务器。它可以将本地视频或音频文件编码并传输到网络服务器上,从而实现实时推流功能。 ffmpeg-web-pusher具有以下几个主要功能: 1. 编码和推送:通过FFmpeg进行音视频编码,然后使用HTTP或RTMP协议将数据推送到Web服务器。这样,可以实现通过Web浏览器或其他支持Web播放的设备来实时观看视频或听取音频。 2. 多种格式支持:ffmpeg-web-pusher支持多种音视频格式,包括常见的MP4、FLV、AVI等。无论是从本地文件还是摄像头进行推流,都可以根据需要选择合适的格式。 3. 音频和视频参数设置:通过ffmpeg-web-pusher,可以根据需求设置音频和视频的各种参数,如比特率、帧率、分辨率等。这样可以根据网络带宽和终端设备的性能来进行适当的优化。 4. 实时监控:ffmpeg-web-pusher提供实时监控功能,可以显示当前推送的音频和视频的传输状态,如帧率、码率、延迟等。这对于调试和优化音视频传输非常有帮助。 ffmpeg-web-pusher是一个功能强大而灵活的工具,可以帮助开发人员实现实时音视频推流功能,并在Web浏览器上进行播放。无论是在线直播、视频会议、视频监控还是其他实时音视频场景,都可以通过使用ffmpeg-web-pusher来实现。它在提供高质量音视频传输的同时,还可以根据具体需求进行各种参数调整,使其更好地适应不同的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值