線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2378
推到 Plurk!
推到 Facebook!

如何进声道“复制”?

答題得分者是:syntax
3CS
一般會員


發表:5
回覆:9
積分:2
註冊:2003-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-31 21:37:40 IP:61.143.xxx.xxx 未訂閱
如何实现把“左声道”的声音“复制”到“右声道”中并消除原有的“右声道”的声音? 能否请前辈们给个提示,谢谢!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-01 17:47:03 IP:61.70.xxx.xxx 未訂閱
直接將左聲道的資料放到右聲道,然後將 0 填給左聲道,不就得了 這也需要問?除非...
3CS
一般會員


發表:5
回覆:9
積分:2
註冊:2003-07-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-01 23:26:16 IP:61.143.xxx.xxx 未訂閱
说谁都会,能否给我例子!谢谢了! 發表人 - 3CS 於 2003/08/01 23:30:37
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-02 20:02:05 IP:61.70.xxx.xxx 未訂閱
引言: 说谁都会,能否给我例子!谢谢了! 發表人 - 3CS 於 2003/08/01 23:30:37
呵呵呵! 我以為你程式寫作方式已經會了,只是不會演算方式,所以要大家給你 [提示] 原來你要的是別人幫你寫程式 那早說麼! 不過你也要告知,你的目的與使用的元件 (當然目的已經知道,只是你要用哪些元件?) 不然貼上來的程式碼你不一定合用 如果你連用哪些元件都不知道如何決定,那說一聲,幫你挑!
3CS
一般會員


發表:5
回覆:9
積分:2
註冊:2003-07-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-02 21:35:28 IP:218.14.xxx.xxx 未訂閱
我用的是DSPACK2.1,谢谢了!
3CS
一般會員


發表:5
回覆:9
積分:2
註冊:2003-07-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-02 21:42:01 IP:218.14.xxx.xxx 未訂閱
当然老大你如果有好的主意,也可以给我以指导,谢谢了!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-03 18:38:59 IP:61.70.xxx.xxx 未訂閱
引言: 我用的是DSPACK2.1,谢谢了!
你要說清楚一點 DSPACK 是套件,不是元件 一個套件有多個元件,不知道你要用哪一個 同時也不知道你的來源 影音檔 ? 聲音檔 ? 我個人是不用這個套件的,所以你要說詳細一點 不然給你的程式,不一定是合乎你需要的 把你的東西簡化,除去你不想公開的部分,然後貼上來,這樣最快! 發表人 - syntax 於 2003/08/03 18:46:07
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-03 18:49:12 IP:140.135.xxx.xxx 未訂閱
syntax大哥您好:   看過一連的討論串後,似乎您對此問題相當的在行< > 那能否就您所知道的方式,提供給有需要的人參考呢?< > 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
3CS
一般會員


發表:5
回覆:9
積分:2
註冊:2003-07-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-04 17:09:20 IP:61.143.xxx.xxx 未訂閱
to:syntax 说实在的这个问题我是一点眉目都没有!如果你能解决,方便的话请出示您的代码,谢了! 我是大陆的,前几天才加入到这个论坛中来,因此你们台湾的一些电脑用语不大明白,比如:“元件”,呵呵,闹了个笑话!这个问题在大陆这边好几个论坛已经问过,但都得不到好的回答!请大哥帮帮忙了!呵呵!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-04 20:02:21 IP:61.70.xxx.xxx 未訂閱
引言: syntax大哥您好: 看過一連的討論串後,似乎您對此問題相當的在行< > 那能否就您所知道的方式,提供給有需要的人參考呢?< > 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ < face="Verdana, Arial, Helvetica"> 不是我在行 而是這個問題本來就相當簡單 我第一次就已經將演算法說出 若是要實做細節,要等一下,正在幫朋友做圖形辨認的程式 今天晚點再貼範例上來
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-05 01:39:42 IP:61.70.xxx.xxx 未訂閱
範例程式 : http://delphi.ktop.com.tw/topic.php?TOPIC_ID=35224
3CS
一般會員


發表:5
回覆:9
積分:2
註冊:2003-07-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-05 08:41:22 IP:61.143.xxx.xxx 未訂閱
怎么没法看到你的范例呀?
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-08-05 14:17:14 IP:61.70.xxx.xxx 未訂閱
引言: 怎么没法看到你的范例呀?
那個連結進不去嗎 ? (進不去,或看不到,再換地方放) 點下載檔案啊 example.exe <- zip 自解包 用 Delphi 6.0 or 7.0 開來看 或直接用 project1.exe 來撥放 2channel.wav
3CS
一般會員


發表:5
回覆:9
積分:2
註冊:2003-07-31

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-08-06 08:23:56 IP:61.143.xxx.xxx 未訂閱
老大,没法点呀!是不是级别不够呀!你还是把那段代码贴出来吧!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-08-06 14:26:30 IP:61.70.xxx.xxx 未訂閱
project.drp
program Project1;    uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};    {$R *.res}    begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.    unit1.dfm    object Form1: TForm1
  Left = 258
  Top = 125
  Width = 154
  Height = 222
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object SpeedButton1: TSpeedButton
    Left = 8
    Top = 8
    Width = 100
    Height = 22
    Caption = 'Open file'
    Flat = True
    OnClick = SpeedButton1Click
  end
  object SpeedButton2: TSpeedButton
    Left = 8
    Top = 40
    Width = 100
    Height = 22
    Caption = 'Play All'
    Flat = True
    OnClick = SpeedButton2Click
  end
  object SpeedButton3: TSpeedButton
    Left = 8
    Top = 72
    Width = 100
    Height = 22
    Caption = 'Play Left Channel'
    Flat = True
    OnClick = SpeedButton3Click
  end
  object SpeedButton4: TSpeedButton
    Left = 8
    Top = 104
    Width = 100
    Height = 22
    Caption = 'Play Right Channel'
    Flat = True
    OnClick = SpeedButton4Click
  end
  object SpeedButton5: TSpeedButton
    Left = 8
    Top = 136
    Width = 100
    Height = 22
    Caption = 'Play Left as Right '
    Flat = True
    OnClick = SpeedButton5Click
  end
  object OpenDialog1: TOpenDialog
    Left = 112
    Top = 8
  end
end    unit1.pas    unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, MMSystem;    type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;
  WFileName: String;
  FS: TMemoryStream;    implementation    {$R *.dfm}    procedure TForm1.SpeedButton1Click(Sender: TObject);
begin     OpenDialog1.Filter := 'Wave File (*.wav)|*.wav';
 if OpenDialog1.Execute then
  WFileName := OpenDialog1.FileName;    end;    procedure TForm1.SpeedButton2Click(Sender: TObject);
begin     if FileExists(WFileName) then
  begin       FS := TMemoryStream.Create;
   FS.LoadFromFile(WFileName);
   PlaySound(PChar(FS.Memory),0,SND_SYNC   SND_MEMORY);
   FS.Free;      end;    end;    procedure TForm1.SpeedButton3Click(Sender: TObject);
var
  NumByte,NumCha: Word;
  StarD: LongWord;
  Prt: Pointer;
  Index: Int64;    begin      if FileExists(WFileName) then
  begin       FS := TMemoryStream.Create;
   FS.LoadFromFile(WFileName);
   Prt := FS.Memory;
   StarD := LongWord(Pointer(Integer(Prt)   16)^)   28;
   NumCha := Word(Pointer(Integer(Prt)   22)^);
   if NumCha = 2 then
    begin         NumByte := Word(Pointer(Integer(Prt)   34)^) div 8;
     Index := StarD   NumByte;
     repeat          FillChar(Pointer(Integer(Prt)   Index)^,NumByte,$00);
      Index := Index   (NumByte * NumCha);         until (Index >= FS.Size);         PlaySound(PChar(FS.Memory),0,SND_SYNC   SND_MEMORY);
     
    end;       FS.Free;      end;    end;    procedure TForm1.SpeedButton4Click(Sender: TObject);
var
  NumByte,NumCha: Word;
  StarD: LongWord;
  Prt: Pointer;
  Index: Int64;    begin      if FileExists(WFileName) then
  begin       FS := TMemoryStream.Create;
   FS.LoadFromFile(WFileName);
   Prt := FS.Memory;
   StarD := LongWord(Pointer(Integer(Prt)   16)^)   28;
   NumCha := Word(Pointer(Integer(Prt)   22)^);
   if NumCha > 1 then
    begin         NumByte := Word(Pointer(Integer(Prt)   34)^) div 8;
     Index := StarD;
     repeat          FillChar(Pointer(Integer(Prt)   Index)^,NumByte,$00);
      Index := Index   (NumByte * NumCha);         until (Index >= FS.Size);         PlaySound(PChar(FS.Memory),0,SND_SYNC   SND_MEMORY);
     
    end;       FS.Free;      end;    end;    procedure TForm1.SpeedButton5Click(Sender: TObject);
var
  NumByte,NumCha: Word;
  StarD: LongWord;
  Prt: Pointer;
  Index: Int64;    begin      if FileExists(WFileName) then
  begin       FS := TMemoryStream.Create;
   FS.LoadFromFile(WFileName);
   Prt := FS.Memory;
   StarD := LongWord(Pointer(Integer(Prt)   16)^)   28;
   NumCha := Word(Pointer(Integer(Prt)   22)^);
   if NumCha > 1 then
    begin         NumByte := Word(Pointer(Integer(Prt)   34)^) div 8;
     Index := StarD;
     repeat          Move(Pointer(Integer(Prt)   Index)^,Pointer(Integer(Prt)   Index   NumByte)^,NumByte);
      Index := Index   (NumByte * NumCha);         until (Index >= FS.Size);         PlaySound(PChar(FS.Memory),0,SND_SYNC   SND_MEMORY);
     
    end;       FS.Free;      end;    end;    end.
3CS
一般會員


發表:5
回覆:9
積分:2
註冊:2003-07-31

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-08-06 16:51:07 IP:61.143.xxx.xxx 未訂閱
非常感谢的您的回答!但这些代码并不是我所要的,如果可以用PlaySound解决的话,我不会问了!呵呵! 我可能没表达出我的意思! 比如:DIVX编码的文件和RM格式的文件(具有两声道-原声和伴唱),如何实现声道“复制”的功能,即按“原声”时,音箱两个声道都是“原声”;按下“伴唱”时,音箱的两个声道都是“伴唱”? 我主要是針对视频文件而言,想达到卡拉OK的效果! 谢谢你的参与!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-08-06 18:25:04 IP:61.70.xxx.xxx 未訂閱
不論是DIVX,RM,AVI...等等原理是一樣的 只要你看得懂我寫的程式所做的動作 那你的問題就解決了 沒有人知道你使用的元件 Component 也不可能世界上所有 Component 都懂 所以我只能貼個範例,讓你去舉一反三,可惜你還是無法解決你的問題 我只能再給你一點建議與方向 1.基本常識 聲道的複製,只是記憶體的搬移,不管任何格式的影音文件,解碼到記憶體後,都是一樣的格式,也就是所有聲音必須解成 PCM 格式才能播放,不論是編解碼邊播放,還是全解碼後才播放,都是以下格式存在記憶體中 (以 16 bits 2 channel 為例) ---- [左聲道],[右聲道],[左聲道][右聲道],[左聲道],[右聲道],....... bits 16 16 16 16 16 16 (以 8 bits 2 channel 為例) ---- [左聲道],[右聲道],[左聲道][右聲道],[左聲道],[右聲道],....... bits 8 8 8 8 8 8 (以 16 bits 2 channel 為例) ---- [左聲道],[右聲道],[左聲道],[右聲道],[左聲道],[右聲道],....... bits 16 16 16 16 16 16 (以 8 bits 單聲道) ---- [單聲道], [單聲道], [單聲道],....... bits 8 8 8 2.Component 的認知 你必須對你所使用的 Component 是使用邊幾碼邊播放,還是載入解碼完後才播放有清楚的瞭解,並要知道資料載後的存放方式 3. 作法 --a. 解碼載入記憶體後才播放 ----找到存放的方式與位置,取出Channel Number 與 Sample Size,然後套用我的程式中的轉換方式將聲道的聲音填入你要的值,看是要左到右,或是右到左,還是以其他來源的聲到取代,如果你要覆蓋聲道後能夠復原,就記得要先備份該聲道 --b. 編解碼邊播放 ----找到解碼後取用該資料來播放的函式,加以改寫,可以將該函式加個前置處理,將聲道用上面的規則複製,看是要左到右,或是右到左,還是以其他來源的聲到取代,因為是編解邊播所以就不用備份了 ps.如果你要用 Medisplayer,ActiveX 之類的嵌入式播放,是無法做到你的要求的,因為其播放的目的碼是寫死的,無法加以更動,所以你要確定你所用的 Component 能對播放的資料(在播放前)加以修改。 只能到這裡再做下去,就變成我在做你的工作了 先充實你這個案子所需要的基本知識吧!
系統時間:2024-04-20 18:36:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!