C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/09(Thu) 20:28) #95265
Re[1]: コマンドプロンプトで逐次的にデータを取得する方法 /Hongliang (20/07/09(Thu) 21:25) #95266
  └ Re[2]: コマンドプロンプトで逐次的にデータを取得する方法 /774RR (20/07/09(Thu) 21:39) #95267
    └ Re[3]: コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/09(Thu) 22:22) #95268
      └ Re[4]: コマンドプロンプトで逐次的にデータを取得する方法 /Hongliang (20/07/09(Thu) 23:52) #95269
        └ Re[5]: コマンドプロンプトで逐次的にデータを取得する方法 /774RR (20/07/10(Fri) 08:58) #95270
          └ Re[6]: コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/10(Fri) 12:40) #95274
            └ Re[7]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/10(Fri) 20:43) #95276
              └ Re[8]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/10(Fri) 20:50) #95277
                └ Re[9]: コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/10(Fri) 21:22) #95278
                  └ Re[10]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/10(Fri) 21:40) #95279
                    └ Re[11]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/10(Fri) 21:48) #95280
                      └ Re[12]: コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/10(Fri) 22:19) #95281
                        └ Re[13]: コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/10(Fri) 22:27) #95282
                          └ Re[14]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/10(Fri) 22:34) #95284
                            └ Re[15]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/10(Fri) 23:12) #95285
                              └ Re[16]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/11(Sat) 00:07) #95286
                                └ Re[17]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/11(Sat) 00:20) #95287
                                  └ コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/11(Sat) 10:27) #95289
                                    └ Re[19]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/11(Sat) 11:46) #95290
                                      └ Re[20]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/11(Sat) 11:52) #95291
                                        └ Re[21]: コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/11(Sat) 16:03) #95292
                                          └ Re[22]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/11(Sat) 20:43) #95293
                                            └ Re[23]: コマンドプロンプトで逐次的にデータを取得する方法 /くまくま (20/07/11(Sat) 22:32) #95294
                                              └ Re[24]: コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/13(Mon) 06:43) #95296
                                                └ Re[25]: コマンドプロンプトで逐次的にデータを取得する方法 /aaap (20/07/21(Tue) 11:44) #95354


親記事 / ▼[ 95266 ]
■95265 / 親階層)  コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (1回)-(2020/07/09(Thu) 20:28:43)

分類:[.NET 全般] 

2020/07/09(Thu) 20:31:02 編集(投稿者)

FFmpegというCUIソフトを使っていて、
コマンドプロンプトでコードを実行した後に
非同期で逐次的にエラー出力を取得したいのですが、

https://dobon.net/vb/dotnet/process/standardoutput.html

ここに書いてある
方法で取得することはできました。

しかし、p.StartInfo.UseShellExecute = False
のところをTrueにしないと、コマンドプロンプト上には結果が表示されなくなります。

しかし、Trueにするには、
p.StartInfo.RedirectStandardErrorをFalseにする必要があります

出力を取得しつつ、
コマンドプロンプトウインドウには結果を表示するにはどのようにすれば良いですか?




[ □ Tree ] 返信 編集キー/

▲[ 95265 ] / ▼[ 95267 ]
■95266 / 1階層)  Re[1]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ Hongliang (1058回)-(2020/07/09(Thu) 21:25:20)
もう1つコンソールアプリを作成し、
そのコンソールアプリでffmpegを実行して標準エラーをリダイレクトし、
取得結果を自分の標準エラーに再出力すると同時に
名前付きパイプでも流すようにする。

元々作っていたアプリは、
名前付きパイプを作成しておいて、
リダイレクトなしで上記コンソールアプリを起動し、
名前付きパイプで出力を受け取る。

という方法などどうでしょうか。
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95266 ] / ▼[ 95268 ]
■95267 / 2階層)  Re[2]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ 774RR (805回)-(2020/07/09(Thu) 21:39:13)
tee ってのが多分やりたいことを実現してると思う

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95267 ] / ▼[ 95269 ]
■95268 / 3階層)  Re[3]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (2回)-(2020/07/09(Thu) 22:22:25)
> もう1つコンソールアプリを作成し、
> そのコンソールアプリでffmpegを実行して標準エラーをリダイレクトし、
> 取得結果を自分の標準エラーに再出力すると同時に
> 名前付きパイプでも流すようにする。

> 元々作っていたアプリは、
> 名前付きパイプを作成しておいて、
> リダイレクトなしで上記コンソールアプリを起動し、
> 名前付きパイプで出力を受け取る。

ありがとうございます。

しかし、具体的にどうすれば良いか分かりません
コードを示していただけないでしょうか?


> tee ってのが多分やりたいことを実現してると思う

なんかできそうな気もするのですが
どうすれば良いか分かりません
ご助言いただけないでしょうか?


[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95268 ] / ▼[ 95270 ]
■95269 / 4階層)  Re[4]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ Hongliang (1059回)-(2020/07/09(Thu) 23:52:45)
> コードを示していただけないでしょうか?

掲示板の十数行で書けるようなものでもないので残念ながら。
名前付きパイプ以外は特に新しい概念はないはずですが。
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95269 ] / ▼[ 95274 ]
■95270 / 5階層)  Re[5]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ 774RR (806回)-(2020/07/10(Fri) 08:58:21)
https://ja.stackoverflow.com/questions/30142
とかでもいけるかも。

tee は標準では入っていないので cygwin をインストールする必要があるっす。
でも cygwin のパスの表記方法と ffmpeg のパスの表記方法が異なるので、慣れていないと混乱の元
powershell なほうが簡単かもしれないっす。

ffmpeg -i c:\mp4\source.mp4 c:\mp4\output.mp4 2>&1 | tee /cygdrive/c/mp4/convert.log


[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95270 ] / ▼[ 95276 ]
■95274 / 6階層)  Re[6]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (4回)-(2020/07/10(Fri) 12:40:06)
うーん、やはり同時に表示するのは難しそうですね。

代替案として、やはりフォーム上にだけコードを表示することを考えています。

FFmepgはキーボードのQキーを押すことでエンコードを停止させることができるのですが、
プログラム上からコマンドラインプログラムにキーコードを送るにはどのようにすれば良いですか?

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95274 ] / ▼[ 95277 ]
■95276 / 7階層)  Re[7]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (1回)-(2020/07/10(Fri) 20:43:17)
私もFFmpegで実行結果を取得するShellプログラムを作って現在使用しています。
FFmpegの場合、実行の経過をエラー出力で画面に表示していますので
私の場合ですがエラー実行結果を非同期で実行して別フォームを表示するようにしています。
ソースがあるんですが、長いのとライブラリ化してVBAで使用できるようにしてしまっているので…
必要ならソースあげましょうか?(vb.net2017版)

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95276 ] / ▼[ 95278 ]
■95277 / 8階層)  Re[8]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (2回)-(2020/07/10(Fri) 20:50:09)
あとFFmpegの場合、複数同時実行してもあまり早くなりませんよ。
(GPUを最大限に使おうとするのと、ファイル読み書きの影響で)


[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95277 ] / ▼[ 95279 ]
■95278 / 9階層)  Re[9]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (5回)-(2020/07/10(Fri) 21:22:53)
No95277 (くまくま さん) に返信

ありがとうございます。
エラー出力の取得の部分は自作プログラムでできているので結構です。

ただ、エンコードを途中で終了させたい場合、
コマンドライン上でQキーを押す必要がありますが、
これをVBのコードから実行するにはどうすれば良いですか?
検索しても情報は見つかりませんでした。

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95278 ] / ▼[ 95280 ]
■95279 / 10階層)  Re[10]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (3回)-(2020/07/10(Fri) 21:40:05)
2020/07/10(Fri) 21:51:25 編集(投稿者)
2020/07/10(Fri) 21:50:03 編集(投稿者)

<pre><pre>shell実行を以下として
Private _proc As System.Diagnostics.Process

_proc = New System.Diagnostics.Process()
Dim psi As New System.Diagnostics.ProcessStartInfo()

psi.FileName = "ファイルパス"
psi.Arguments = "実行コマンド"
psi.RedirectStandardError = True
psi.UseShellExecute = False
_proc.StartInfo = psi

'----- 実行
Call _proc.Start()


shellの実行を停止
Try
_proc.Kill()
_proc.WaitForExit()
_proc.Close()
Catch ex As System.Exception
End Try

これでいいかな?</pre></pre>
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95279 ] / ▼[ 95281 ]
■95280 / 11階層)  Re[11]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (4回)-(2020/07/10(Fri) 21:48:49)
それか
shell実行時
    psi.RedirectStandardInput = True
として

Try
    If _proc.StandardInput.BaseStream.CanWrite Then
        _proc.StandardInput.WriteLine("Q")
    End If
Catch ex As System.Exception
End Try
※これで止まるかは不明

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95280 ] / ▼[ 95282 ]
■95281 / 12階層)  Re[12]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (6回)-(2020/07/10(Fri) 22:19:31)
ありがとうございます。
_proc.Kill()

というように強制的に終了させてしまうと、
途中までエンコードしていても再生できないファイルになってしまいます。
_proc.StandardInput.WriteLine("Q")
はいけそうな気がしたのですが、
_proc.StandardInput.BaseStream.CanWrite
のところでエラーが出て実行できませんでした、

https://dobon.net/vb/dotnet/process/standardoutput.html

このページを見ると
p.WaitForExit()
の前に実行する必要があるのではないでしょうか?

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95281 ] / ▼[ 95284 ]
■95282 / 13階層)  Re[13]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (8回)-(2020/07/10(Fri) 22:27:58)

p.Kill()
p.WaitForExit()
p.Close()


こちらも試してみましたが、
コマンドラインからエラー出力が送られてくるのは止まったのですが、
FFmpegだけがなぜかバックグラウンドで動き続けてしまうのですが。

コマンドプロンプトウインドウを手動で消さないと
FFmpegが停止してくれません

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95282 ] / ▼[ 95285 ]
■95284 / 14階層)  Re[14]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (6回)-(2020/07/10(Fri) 22:34:42)
No95282 (aaap さん) に返信
>
> p.Kill()
> p.WaitForExit()
> p.Close()
>
>
> こちらも試してみましたが、
> コマンドラインからエラー出力が送られてくるのは止まったのですが、
> FFmpegだけがなぜかバックグラウンドで動き続けてしまうのですが。
>
> コマンドプロンプトウインドウを手動で消さないと
> FFmpegが停止してくれません
>
こちらでは停止しているのですが…
ちょっと動作確認してから再度書き込みますね
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95284 ] / ▼[ 95286 ]
■95285 / 15階層)  Re[15]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (7回)-(2020/07/10(Fri) 23:12:48)
2020/07/10(Fri) 23:13:43 編集(投稿者)

No95284 (くまくま さん) に返信
> ■No95282 (aaap さん) に返信
>>
>> p.Kill()
>> p.WaitForExit()
>> p.Close()
>>
>>
>>こちらも試してみましたが、
>>コマンドラインからエラー出力が送られてくるのは止まったのですが、
>>FFmpegだけがなぜかバックグラウンドで動き続けてしまうのですが。
>>
>>コマンドプロンプトウインドウを手動で消さないと
>>FFmpegが停止してくれません
>>
> こちらでは停止しているのですが…
> ちょっと動作確認してから再度書き込みますね

使用バージョン
ffmpeg version git-2019-11-20-d73f062
コマンド
"ffmpeg.exe" -c copy "c:\test.mp4" -i "c:\Test.avi"
変換前aviファイル 3GB(30分)
変換後mp4ファイル 1.8GB

ffmpeg実行後一定カウント(15分前後)で
Try
_proc.Kill()
_proc.WaitForExit()
_proc.Close()
Catch ex As System.Exception
End Try
を実行
・エラー出力の停止を確認
・ファイルサイズの更新を確認
・ffmpegのプロセスを確認
すべて停止している事を確認
これを10回カウント位置を変更して確認

…で停止してるんだけど?
Catchされてるとかないよね?
※_proc.StandardInput.WriteLine("Q")はダメでした

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95285 ] / ▼[ 95287 ]
■95286 / 16階層)  Re[16]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (8回)-(2020/07/11(Sat) 00:07:25)
>_proc.Kill()
>
>というように強制的に終了させてしまうと、
>途中までエンコードしていても再生できないファイルになってしまいます。
ごめんなさい見落としていました。
aaapさんがどんな変換を求めているかわかりませんが、大体の動画ファイルは途中でエンコードを止めれば変換エラーのファイルになります。
FFmpeg のコマンドで 「-ss 00:00:00」「-t 00:00:00」で時間指定できますので、もし一部分の切り出しだったらそちらをお勧めします。
(もちろん複数ファイルの結合もできます)
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95286 ] / ▼[ 95289 ]
■95287 / 17階層)  Re[17]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (9回)-(2020/07/11(Sat) 00:20:22)
誤り
>_proc.StandardInput.WriteLine("Q")
正しくは
_proc.StandardInput.WriteLine("q")
にて停止を確認。mp4への変換では再生可能でした。
ただし変換にもよりますが、どうしても停止まで時間がかかります。
即応答ではないので注意して下さい。
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95287 ] / ▼[ 95290 ]
■95289 / 18階層)  コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (9回)-(2020/07/11(Sat) 10:27:05)
2020/07/11(Sat) 10:33:15 編集(投稿者)
2020/07/11(Sat) 10:28:07 編集(投稿者)

<pre><pre>ありがとうございます。

少しはしょっていますが、コードは以下のような流れになっています。

仰る通り、
_proc.StandardInput.WriteLine("q")
に変更することで、プログラムを停止させることができるようになりました。
しかし、再度、プログラムを実行しようとすると

p.BeginErrorReadLine()


追加情報:非同期読み取り操作はストリーム上で既に開始されました。

というエラーが出てしまい、先に進みません。
と思ったのですが、

p = New System.Diagnostics.Process()

を最後に入れると、うまく再実行できるようになりました。




p.Kill()
p.WaitForExit()
p.Close()

の方も再度試してみましたが、上記で述べたように、
System.Diagnostics.Process()は停止するものの、
コマンドプロンプトは停止せず、FFmpegはバックグラウンドに残ってしまいます。

Catchもされていないようです。

一応、Qキーの方でうまくはいっているのですが
二つ目の方法がうまくいかないのは
何が原因でしょうか?



Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

バックグラウンドプロセス呼び出し

End Sub


Public Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

StopBool = True

End Sub




Public Sub バックグラウンドプロセス




p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")


p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardError = True
p.StartInfo.RedirectStandardInput = True


AddHandler p.ErrorDataReceived, AddressOf p_OutputDataReceived


p.StartInfo.CreateNoWindow = False
p.StartInfo.Arguments = "/c ffmpeg xxxxx"

p.Start()

p.BeginErrorReadLine()

p.WaitForExit()

p.Close()


End Sub



  Public p As New System.Diagnostics.Process()
 
Public StopBool As Boolean = False



Private Sub p_OutputDataReceived(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)


If StopBool = True Then


Dim method = 1

If method = 0 Then

Try
If p.StandardInput.BaseStream.CanWrite Then
p.StandardInput.WriteLine("q")

End If
Catch ex As System.Exception
End Try


Else


Try

p.Kill()
p.WaitForExit()
p.Close()
Catch ex As System.Exception

Dim hhh = 34

End Try



End If




End If
コードをテキストボックスに表示

End Sub</pre></pre>
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95289 ] / ▼[ 95291 ]
■95290 / 19階層)  Re[19]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (11回)-(2020/07/11(Sat) 11:46:41)
No95289 (aaap さん) に返信
>プログラムを停止させることができるようになりました。
>しかし、再度、プログラムを実行しようとすると
条件が増えているよ...
再度整理してみましょう。
1.FFmpegをvb.net上から実行したい。
2.FFmpeg実行経過をshellのエラー出力から随時取得したい。
3.FFmpegが実行途中でも中止できるようにしたい。
4.FFmpegが中止された際出力されたファイルは再生できる事。
でよいのかな?
それとも
5.FFmpegの処理を一時停止もしたい。
も含むという事かな?

>p.Kill()
実行したプロセスを強制終了する。
>p.WaitForExit()
実行したプロセスが終了するまで待機する。
>p.Close()
プロセスを開放する。

まずバックグラウンドプロセスで
p.WaitForExit()
p.Close()
が入っているのでp_OutputDataReceivedでの
p.WaitForExit()
p.Close()
は不要になります。

またp_OutputDataReceivedでのボタン判定はエラー出力がない場合処理判定できません。
(FFmpegのエラー出力タイミングはスペックが低いマシンだと数十秒かかります。)
p.WaitForExit()で止めるのではなくループでp.HasExitedを確認
(System.Windows.Forms.Application.DoEvents()とSystem.Threading.Thread.Sleep()で調整が必要)

>p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
>p.StartInfo.Arguments = "/c ffmpeg xxxxx"
これだとcmd.exeからffmpegを実行している事になるので

p.StartInfo.FileName = "FFmpegのファイルパス"
(パスが通っているので p.StartInfo.FileName = "ffmpeg.exe" でOK)
p.StartInfo.Arguments = "実行コマンド"
(p.StartInfo.Arguments = "xxxxx")
これでFFmpegを実行できます。

>p.StandardInput.WriteLine("q")
コマンドプロンプトでqキーを入力しているので
ffmpeg.exeは終了してもcmd.exeは終了していないのでは?

>追加情報:非同期読み取り操作はストリーム上で既に開始されました。
pがcloseしてない状態で出力が残っている場合エラーになります。
p.CancelOutputRead()
p.CancelErrorRead()
を実行するか出力をすべて読み切って下さい。

やっぱりソースいる?
「百聞は一見にしかず」じゃないけど実際動作しているソースを見て
ステップ実行などでソースを解釈して自分のソースを書き直したほうが早いと思うよ
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95290 ] / ▼[ 95292 ]
■95291 / 20階層)  Re[20]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (12回)-(2020/07/11(Sat) 11:52:37)
>p.WaitForExit()で止めるのではなくループでp.HasExitedを確認
>(System.Windows.Forms.Application.DoEvents()とSystem.Threading.Thread.Sleep()で調整が必要)
またはpをpublic変数としてButton2_Clickでp.StandardInput.WriteLine("q")でも大丈夫。
(ただしバックグラウンドプロセスの終了確認は必要)


[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95291 ] / ▼[ 95293 ]
■95292 / 21階層)  Re[21]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (10回)-(2020/07/11(Sat) 16:03:20)

ありがとうございます。

大体分かってきました。

コマンドラインから実行するのではなく、直接ffmpegを実行するとうまく停止させることができました。

> やっぱりソースいる?

もし差し支えなければアップしていただけますでしょうか?


あと、一つ気になっているのですが、
コマンドラインだと、
最初にエンコード条件が表示された後に、

frame= 7653 fps=1271 q=18.0 size= 116480kB time=00:04:15.58 bitrate=3733.5kbits/s speed=42.5x

というようなコードが逐次的に表示されますが、
エンコード条件だけは消えずに残るのに対し、
この逐次的に表示されるコードだけは累積せずに、
過去のコードが消えては新しいコードに書き換わってというのを繰り返しています。

これをプログラム上でも行いたいのですが、
どのようにすれば良いですか?

単に出力コードの先端が、frame= であるかどうか確認するしかないのでしょうか?

コマンドライン上でそのようなことをしているとは思えないので、
何か方法があるのでしょうか?


[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95292 ] / ▼[ 95294 ]
■95293 / 22階層)  Re[22]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (13回)-(2020/07/11(Sat) 20:43:06)
2020/07/11(Sat) 20:44:42 編集(投稿者)

No95292 (aaap さん) に返信
> もし差し支えなければアップしていただけますでしょうか?
少々おまちください。コメント等整理します。

>コマンドラインから実行するのではなく、直接ffmpegを実行するとうまく停止させることができました。
ソースコメントには記載しておきますがcmd.exeでコマンド実行終了しても
cmd.exeは終了せずに次のコマンドを受け付ける為に待機状態になります。
(コマンドプロンプトで複数のコマンドが実行できる事で想像できるかと思います)
その為今回必要ありませんが終了判定で「一定時間、標準・エラー出力がない場合」の処理が含まれますので
ご了承下さい。

> 単に出力コードの先端が、frame= であるかどうか確認するしかないのでしょうか?
はい。ffmpegがエラー出力を消して再表示を行っていますが
「消す」イベントを取得することがvb.net上でできません。
(取得できるのはライン追加のみ)
形式が決まっているので"frame="で判定するしかないです。
(ほかにfpsが1000単位でメッセージが表示されたような...)
[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95293 ] / ▼[ 95296 ]
■95294 / 23階層)  Re[23]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ くまくま (14回)-(2020/07/11(Sat) 22:32:32)
2020/07/11(Sat) 22:33:32 編集(投稿者)

ソースアップしておきました。
http://kumakuma.g1.xrea.com/vb.net/shell/ffmpegtest.zip
(vb.net2017 Framework4.5.2)
※必ずファイルをウイルス検査する事

Form1.vbの6行目
Call Shell.Exec("""ffmpeg.exe"" -c copy ""c:\test.mp4"" -i ""c:\Test.avi""", vbHide, "UTF8")
ここを変更すれば動くはずです。(実行内容は「出力」タブに表示されます)

また簡易確認だったので5秒で停止としていますかボタンでStopBool変数にtrueを設定して対応することも可能です。

あと気になっていたのですが、このトピック分類は「VB.NET/VB2005 以降」では?

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95294 ] / ▼[ 95354 ]
■95296 / 24階層)  Re[24]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (11回)-(2020/07/13(Mon) 06:43:55)
ありがとうございます。
ダウンロードできました。

試してみて
もし、疑問点があればまた質問いたします。

[ 親 95265 / □ Tree ] 返信 編集キー/

▲[ 95296 ] / 返信無し
■95354 / 25階層)  Re[25]: コマンドプロンプトで逐次的にデータを取得する方法
□投稿者/ aaap (12回)-(2020/07/21(Tue) 11:44:01)
ありがとうございます。

ちなみに
https://upload.wikimedia.org/wikipedia/commons/1/17/Ffmpeg-3.4.png

この画像のようにFFmpegは異なる色のメッセージを出力することがありますが、
この色情報を取得するにはどのようにすれば良いですか?

[ 親 95265 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -