铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 4202|回复: 1

ffmpeg高版本重采样的pascal翻译

[复制链接]
发表于 2015-2-5 19:22 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x

c语言的版本到处都有,pascal的不好找,只能自己翻译。

  1. //use it like:
  2. //AudioResampling(aCodecCtx, frame, AV_SAMPLE_FMT_S16, frame.channels, frame.sample_rate, audio_buf0);

  3. function AudioResampling(audio_dec_ctx: PAVCodecContext; pAudioDecodeFrame: pAVFrame;
  4.   out_sample_fmt: TAVSampleFormat; out_channels: integer; out_sample_rate: integer; out_buf: pbyte): integer;
  5. var
  6.   swr_ctx: pSwrContext = nil;
  7.   data_size: integer = 0;
  8.   ret: integer = 0;
  9.   src_ch_layout: int64;
  10.   dst_ch_layout: int64;
  11.   dst_nb_channels: integer = 0;
  12.   dst_linesize: integer = 0;
  13.   src_nb_samples: integer = 0;
  14.   dst_nb_samples: integer = 0;
  15.   max_dst_nb_samples: integer = 0;
  16.   dst_data: ppbyte = nil;
  17.   resampled_data_size: integer = 0;
  18. begin
  19.   Result := -1;
  20.   src_ch_layout := audio_dec_ctx.channel_layout;
  21.   dst_ch_layout := AV_CH_LAYOUT_STEREO;
  22.   swr_ctx := swr_alloc();
  23.   if swr_ctx = nil then
  24.   begin
  25.     consolelog('swr_alloc error');
  26.     exit;
  27.   end;

  28.   if audio_dec_ctx.channels = av_get_channel_layout_nb_channels(audio_dec_ctx.channel_layout) then
  29.     src_ch_layout := audio_dec_ctx.channel_layout
  30.   else
  31.     src_ch_layout := av_get_default_channel_layout(audio_dec_ctx.channels);

  32.   if out_channels = 1 then
  33.   begin
  34.     dst_ch_layout := AV_CH_LAYOUT_MONO;
  35.     //consolelog('dst_ch_layout: AV_CH_LAYOUT_MONO');
  36.   end
  37.   else if out_channels = 2 then
  38.   begin
  39.     dst_ch_layout := AV_CH_LAYOUT_STEREO;
  40.     //consolelog('dst_ch_layout: AV_CH_LAYOUT_STEREO');
  41.   end
  42.   else
  43.   begin
  44.     dst_ch_layout := AV_CH_LAYOUT_SURROUND;
  45.     //consolelog('dst_ch_layout: AV_CH_LAYOUT_SURROUND');
  46.   end;

  47.   if src_ch_layout <= 0 then
  48.   begin
  49.     consolelog('src_ch_layout error');
  50.     exit;
  51.   end;

  52.   src_nb_samples := pAudioDecodeFrame.nb_samples;
  53.   if src_nb_samples <= 0 then
  54.   begin
  55.     consolelog('src_nb_samples error');
  56.     exit;
  57.   end;

  58.   av_opt_set_int(swr_ctx, 'in_channel_layout', src_ch_layout, 0);
  59.   av_opt_set_int(swr_ctx, 'in_sample_rate', audio_dec_ctx.sample_rate, 0);
  60.   av_opt_set_sample_fmt(swr_ctx, 'in_sample_fmt', audio_dec_ctx.sample_fmt, 0);

  61.   av_opt_set_int(swr_ctx, 'out_channel_layout', dst_ch_layout, 0);
  62.   av_opt_set_int(swr_ctx, 'out_sample_rate', out_sample_rate, 0);
  63.   av_opt_set_sample_fmt(swr_ctx, 'out_sample_fmt', out_sample_fmt, 0);

  64.   if swr_init(swr_ctx) < 0 then
  65.   begin
  66.     consolelog('Failed to initialize the resampling context');
  67.     exit;
  68.   end;
  69.   dst_nb_samples := av_rescale_rnd(src_nb_samples, out_sample_rate, audio_dec_ctx.sample_rate, AV_ROUND_UP);
  70.   max_dst_nb_samples := dst_nb_samples;
  71.   if max_dst_nb_samples <= 0 then
  72.   begin
  73.     consolelog('av_rescale_rnd error');
  74.     exit;
  75.   end;

  76.   dst_nb_channels := av_get_channel_layout_nb_channels(dst_ch_layout);
  77.   ret := av_samples_alloc_array_and_samples(@dst_data, @dst_linesize, dst_nb_channels,
  78.     dst_nb_samples, out_sample_fmt, 0);
  79.   if ret < 0 then
  80.   begin
  81.     consolelog('av_samples_alloc_array_and_samples error');
  82.     exit;
  83.   end;


  84.   dst_nb_samples := av_rescale_rnd(swr_get_delay(swr_ctx, audio_dec_ctx.sample_rate) +
  85.     src_nb_samples, out_sample_rate, audio_dec_ctx.sample_rate, AV_ROUND_UP);
  86.   if dst_nb_samples <= 0 then
  87.   begin
  88.     consolelog('av_rescale_rnd error ');
  89.     exit;
  90.   end;
  91.   if dst_nb_samples > max_dst_nb_samples then
  92.   begin
  93.     av_free(dst_data^);
  94.     ret := av_samples_alloc(dst_data, @dst_linesize, dst_nb_channels, dst_nb_samples,
  95.       out_sample_fmt, 1);
  96.     max_dst_nb_samples := dst_nb_samples;
  97.   end;

  98.   if swr_ctx <> nil then
  99.   begin
  100.     ret := swr_convert(swr_ctx, dst_data, dst_nb_samples, pAudioDecodeFrame.Data, pAudioDecodeFrame.nb_samples);
  101.     if (ret < 0) then
  102.     begin
  103.       consolelog('swr_convert error');
  104.       exit;
  105.     end;

  106.     resampled_data_size := av_samples_get_buffer_size(@dst_linesize, dst_nb_channels, ret,
  107.       out_sample_fmt, 1);
  108.     if (resampled_data_size < 0) then
  109.     begin
  110.       consolelog('av_samples_get_buffer_size error');
  111.       exit;
  112.     end;
  113.   end
  114.   else
  115.   begin
  116.     consolelog('swr_ctx null error');
  117.     exit;
  118.   end;

  119.   move(dst_data^^, out_buf^, resampled_data_size);

  120.   if (dst_data <> nil) then
  121.   begin
  122.     av_freep(@dst_data^);
  123.   end;
  124.   av_freep(@dst_data);
  125.   dst_data := nil;

  126.   if swr_ctx <> nil then
  127.   begin
  128.     swr_free(@swr_ctx);
  129.   end;
  130.   Result := resampled_data_size;
  131. end;
复制代码
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2015-6-19 09:13 | 显示全部楼层
不了解 不懂:(
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-12-4 01:43

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表