HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0909
スペースストリームの混合を行う方法22未解決


スペース

リンク

2015/9/9(Wed) 18:28:34|NO.71536

以下のスレで書いた通り、現在録画ソフトを作っています。
http://hsp.tv/play/pforum.php?mode=all&num=71183
画面の取り込みと記録の問題は皆様のおかげで解決できたのですが、
音声付きで動画を出力する方法が解りません。

動画のみを出力する場合はcvopenavi "filename",p1で簡単に出来るのですが、
これに音声を加えるとなるとディスク上にある動画と音声を混合(ストリームの混合)、
もしくは出力する時点で動画と音声を合わせて1つの音声付き動画として出力する2つのパターンが有ると思うのですが、
現状どちらもやり方が解らないという状況です。
まず、音声の録音(重複表現ですが。)は、ファイルとして出力するMCIと、PCM入出力プラグイン(変数に音声を録音)の2つを考えています。
PCM入出力プラグイン:http://www.binzume.net/software/forhsp.html

次に、動画付き音声を出力する方法ですが、
自分が調べた限り、HSP関連ではこの2つのスレしか見つけることが出来ませんでした。
http://www.hsp.tv/play/pforum.php?mode=pastwch&num=49592
http://hsp.tv/play/pforum.php?mode=pastwch&num=41634


後者に関してはザーメン様のDLLが既にダウンロードできなくなっている為、
どうすることも出来ないというのが現状です。(自分はC言語が読めないので書き直すことも出来ません・・)

ザーメン様にDLLの再アップロードをして頂けると凄く嬉しいのですが、可能でしょうか。
もしこのスレッドを見ていましたら、検討の程よろしくお願い致します。

また、他の方法でも構わないので音声付き動画を出力する方法を知っている方が居ましたら教えて頂けないでしょうか?



この記事に返信する


Flat

リンク

2015/9/9(Wed) 18:36:59|NO.71537

#module aviwave
#uselib "avifil32.dll" #func AVIFileInit "AVIFileInit" #cfunc AVISaveOptions "AVISaveOptions" int, int, int, var, var #cfunc AVISaveV "AVISaveV" str, int, int, int, var, var #func AVISaveOptionsFree "AVISaveOptionsFree" int, var #cfunc AVIStreamOpenFromFile "AVIStreamOpenFromFile" var, str, int, int, int, int #func AVIFileOpen "AVIFileOpen" var, str, int, nullptr;int #func AVIFileGetStream "AVIFileGetStream" int, var, int, int #func AVIFileRelease "AVIFileRelease" int #func AVIStreamRelease "AVIStreamRelease" int #func AVIFileExit "AVIFileExit" #defcfunc _SaveAviFile str resfname, int havi, int hwav /*repeat 2 ZeroMemory(&options[i], sizeof(AVICOMPRESSOPTIONS)); lpOptions(cnt) = &options[i]; wait 0 loop*/ pavis = havi, hwav dim x, 2 /*dim lpOptions, 44, 2 if optdlg { sores = AVISaveOptions(hwnd, 0, 2, pavis, lpOptions) if sores != 0 & sores != 1 : return 1 if sores = 0 : x = 0, 0 : else { x(0) = lpOptions(0) x(1) = lpOptions(1) } } else : */x = 0, 0 code = 0 if AVISaveV(resfname, 0, 0, 2, pavis, x) : code = 2 ;if sores = 1 : AVISaveOptionsFree 2, lpOptions return code #defcfunc _GetAudioFromAVI str wavifn AVIFileOpen audavi, wavifn, 0;, 0 if stat != 0 : return -3 AVIFileGetStream audavi, hwave, 1935963489, 0 code = stat AVIFileRelease audavi if code : return -4 return hwave #deffunc AddSoundToAVI str avifn, str _wavfn, str resfn wavfn = _wavfn AVIFileInit if AVIStreamOpenFromFile(aviVideo, avifn, 1935960438, 0, 0, 0) { AVIFileExit return -1 } if getpath(wavfn, 18) == ".avi" { aviAudio = _GetAudioFromAVI(wavfn) if aviAudio < 0 : return aviAudio } else : if getpath(wavfn, 18) == ".wav" { if AVIStreamOpenFromFile(aviAudio, wavfn, 1935963489, 0, 0, 0) { AVIStreamRelease aviVideo AVIFileExit return -2 } } else { AVIStreamRelease aviVideo AVIFileExit return -5 } ret = _SaveAviFile(resfn, aviVideo, aviAudio) AVIStreamRelease aviAudio AVIStreamRelease aviVideo AVIFileExit return ret #global

使い方:以下で 動画+音声.avi を出力します
AddSoundToAVI "動画のみ.avi", "音声.wav", "動画+音声.avi"

大分前に作ったものなので正常に動作するかは確認できていません



スペース

リンク

2015/9/9(Wed) 19:05:18|NO.71540

>>Flatさん
有難うございます。
適当に動画と音声を用意して試した所、混合できました。
音声がとぎれとぎれですが恐らく元の動画と音声が原因だと思うので、
後で色々試してみます。
本当に有難うございました。



葡萄色

リンク

2015/9/9(Wed) 21:06:12|NO.71554

そのスレッドの質問主なのでそのDLLを持っていますが、著作権がザーメンさんにあるためアップロードすることができません…無念です…。
それにしても改めて昔の自分の書き込みを見ると態度が酷い。



スペース

リンク

2015/9/9(Wed) 21:19:24|NO.71556

葡萄色さんの名前は時々見ていましたが、まさかそのスレッドを立てた本人だったとは。
とりあえずFlatさんのソースコードでなんとか出来るか色々試してみます。



kanahiron

リンク

2015/9/10(Thu) 01:41:06|NO.71560

DLLでやるくらいならffmepgとか使っちゃダメなんでしょうか(´・ω・`)?



スペース

リンク

2015/9/10(Thu) 10:20:52|NO.71561

ffmpegはAddSoundToAVIより優れているのでしょうか?
うろ覚えですが、コマンドプロンプトが表示されたり、
配布するときファイル数が多くなりませんか?



スペース

リンク

2015/9/10(Thu) 17:14:55|NO.71563

質問ばかりで申し訳ありません。態々スレを立てる程でもないので、このスレッドで質問します。
PCM入出力プラグインで入力デバイスを指定できるのですが、上手く指定することが出来ません。

まず、マイクとステレオミキサーとスピーカー2つがあるにも関わらず一つしか表示されません。
波形自体は録音の既定のデバイスに指定されているものが表示されているようです。
https://gyazo.com/2bc1bb389aaeba5504b4b063d2cf4ba8

マイクを既定のデバイスに指定すればマイクを録音できますが、
今度はPCの方を録音できなくなります。

再生の既定のデバイスと、録音の既定のデバイスを指定できればいいのですが、
MCIでもwinmm.dllを使った録音でも「録音の既定のデバイス」しか指定できません。

winmm.dllを使った録音はこちらのスレッドを参考にしています。
http://hsp.tv/play/pforum.php?mode=pastwch&num=21758
色々調べた結果、WAVE_MAPPERの値を変更することで入力デバイスを変更する事ができるようなんですが、
0や1を指定しても再生のデバイスを指定することは出来ませんでした。

どの方法でもいいので、再生のデバイスと録音のデバイスを指定する方法を教えていただけないでしょうか?



Noap

リンク

2015/9/10(Thu) 18:59:02|NO.71564

よくは分かりませんがとりあえずこれを実行して入力デバイスの個数をみてみてはどうでしょうか。


#uselib "winmm.dll" #cfunc waveInGetNumDevs "waveInGetNumDevs" mes "入力デバイスは"+waveInGetNumDevs()+"こあります"



スペース

リンク

2015/9/10(Thu) 19:01:32|NO.71565

>>Noapさん
有難うございます。
waveInGetNumDevsを実行した所2個と表示されました。
自分もいろいろ調べてこの命令に行き着き試したのですが、その事を書いたほうが良かったですね。
申し訳ございません。



Noap

リンク

2015/9/10(Thu) 19:03:47|NO.71566

もう確かめていたのであれば余計なことをかいてしまいすみませn。



Noap

リンク

2015/9/10(Thu) 20:21:01|NO.71568

大事なことを書き忘れていました。
ステレオミキサーは搭載されていなかったり無効にされていたりする場合があるので注意してください。
わたしのパソコンには搭載されていないようです。(ドライバーが古いのかもしれませんが)



スペース

リンク

2015/9/10(Thu) 20:43:15|NO.71570

>>Noapさん
やはりそうですよね。
現時点でもステレオミキサーは指定できるので、マイク音をPCで再生すれば一緒に録音出来るのですが、
不便ですしステレオミキサーがないPCではもう音を入れることが出来ない、という状況になるんですよね・・・



Noap

リンク

2015/9/10(Thu) 21:16:01|NO.71573

画像を見る限り入力デバイスの数は1ことなっていますがそれはどんな方法で取得しましたか。わたしにはwaveInGetNumDevsしかわからないのでよければ教えてください。
また画像を見る限りwaveInGetDevCapsでちゃんとデバイス名は取得できているのでデバイスIDは0から数えるようにしているか確認してください。もし0から数えるようにしているのであればごめんなさい。
それと書き忘れましたがNoaという名前はもともと打ち間違えをそのまま使っていたのでNoapに掲示板上の名前を変えました。

カママルカの瞳のヘルプページで確認しましたがカママルカの瞳もステレオミキサーがないとそのままでは録音できないようです。
なので音声についてはむずかしそうとおもいます。

ヘルプページ
http://www.paw.hi-ho.ne.jp/milbesos/support/baile/009device7.html



スペース

リンク

2015/9/10(Thu) 21:28:46|NO.71574

>>Noapさん
PCM入出力プラグインにw_in_getlinesという命令があり、
それで取得すると1と表示されます。内部の詳しい処理は解りません。
デバイス名の取得はw_out_getdevnameで行っています。
試しに取得した数(変数で言うとs)に+1をしてみましたが、同じデバイス名が2つ表示されるだけで、正常に2つ取得することは出来ませんでした。
p2は
以下はサンプルの一部です

/*Readmeから一部コピー ・w_in_getlines dev,v1 v1…入力ラインの数が格納されます ・w_in_getlinename s1,dev,line s1…入力ラインの名前を取得する文字列型変数 dev…ディバイスの番号 line…入力ラインの番号 */ #include "hspwave.as" ;波形表示(ライン選択可) pos 10,260 sdim s,64 w_out_getdevname s,0 w_in_getlines in_lines,0 Dialog in_lines mes "ディバイス名 : " + s mes "入力ライン数:"+in_lines w_in_selline 0,-1 a=stat // 一覧作成 sdim list,32768 repeat in_lines w_in_getlinename s,0,cnt list+=s+"\n" loop

カハマルカの瞳もステレオミキサーがないと上手く録音できないんですね。
調べて頂きありがとうございました。



Noap

リンク

2015/9/10(Thu) 22:28:09|NO.71580

hspwaveはどこで手にはいりますか。



スペース

リンク

2015/9/10(Thu) 22:37:40|NO.71581

レスにURLを貼ったほうが良かったですね。こちらのページの「PCM入出力プラグイン for HSP」がそのプラグインです。
http://www.binzume.net/software/forhsp.html
中にサンプルが3つ入っていると思うのですが、デバイスを指定できるサンプルは「sample3.as」です。
HSP2時代のコードっぽいので、peekとラベルジャンプでエラーが出ると思います。
修正前

peek c,buf,cnt line cnt,c

修正後

line cnt,peek(buf,cnt)

gotoはアスタリスクを付け加えるだけで動くと思います。



スペース

リンク

2015/9/10(Thu) 23:20:39|NO.71583

サンプル有難うございます。これから1行ずつ読んでみます。
http://hsp.tv/play/pforum.php?mode=all&num=71582



スペース

リンク

2015/9/10(Thu) 23:25:41|NO.71584

構造体をよく理解していなく、さらにどういう順番・サイズで入るのかわからなかったのですが、
「WAVEINCAPS構造体」とかで検索すれば出てくるんですね。
http://kana-soft.com/tech/sample_0010.htm



Noap

リンク

2015/9/10(Thu) 23:39:20|NO.71585

共有メモリのことを全く知らなかったわたしのいえるようなことではありませんが、C言語をある程度ポインタや構造体の概念やごく簡単なGUIを扱える程度に勉強していればHSPがもっとたのしくなると思います。ちなみにわたしは少し打ち間違えただけでパソコンがフリーズしたりするしメモリーリークやオーバーフローが分かりにくいのでのでおちょこちょいのわたしはC言語は苦手です。
アプリケーションごとに仮想アドレスが割り当てられるので直接やりとりできないのは当たり前なのですが、なぜか直接ポインタでやり取りできると思いこんでいました。すみません。



スペース

リンク

2015/9/10(Thu) 23:51:23|NO.71586

>>Noapさん
やはり少しは覚えておいた方はいいですよね。
何度も挑戦はしては居るんですけど、
チュートリアル的なのを達成して難しすぎてやる気が尽きてしまいます・・・



Noap

リンク

2015/9/10(Thu) 23:54:24|NO.71587

構造体やポインタはまだチュートリアルだと思いますが。わたしよりいろいろな役にたちそうなスクリプトを書いているのでスペースさんのほうがプログラミングは上手だと思います。



Noap

リンク

2015/9/10(Thu) 23:56:15|NO.71588

わたしのそのサンプルスクリプトはあまり書き方が上手ではないと思うのですみません。



ONION software Copyright 1997-2021(c) All rights reserved.