コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutpu …
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコードです。
 ※a.m4aをa.mp3に320kbpsのビットレートで変換するコマンドになります。

現状をまとめると以下のようになります。
(1)コマンドプロンプトを手動で起動して、以下のコマンドを打ち込むとうまく変換してくれる。
"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
(2)しかしこのコマンドを下記のコードで実行すると処理が行われない。
(3)そうなると下記のコード自体に問題があるように思われるが、
下記のコードで"dir c:\"など簡単なコマンドを実行すると成功する。

ダブルクオテーション(")やスペースなどに問題があるのかと思いいろいろと試してみましたがダメでした。
どうすれば下記のコードで"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"のようなコマンドを実行出来るのでしょうか?
実行する方法、もしくは違うコードで実行する方法などを知っておられる方、ぜひご教授ください!非常に困っております。


---------------------------------------------------------------------------------------------------
■コマンドプロンプトをC#上から実行するコード
http://dobon.net/vb/dotnet/process/standardoutpu …のコードの丸写し
---------------------------------------------------------------------------------------------------
//Processオブジェクトを作成
System.Diagnostics.Process p = new System.Diagnostics.Process();

//ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
//出力を読み取れるようにする
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = false;
//ウィンドウを表示しないようにする
p.StartInfo.CreateNoWindow = true;
//コマンドラインを指定("/c"は実行後閉じるために必要)


//○成功する
p.StartInfo.Arguments = "dir c:\";
//×失敗する
p.StartInfo.Arguments = "\"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";


//起動
p.Start();
//出力を読み取る
string results = p.StandardOutput.ReadToEnd();
//プロセス終了まで待機する
//WaitForExitはReadToEndの後である必要がある
//(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit();
p.Close();

//出力された結果を表示
Console.WriteLine(results);
---------------------------------------------------------------------------------------------------

A 回答 (1件)

>うまくいきません。



「なにが」「どう」「いまくいかない」んでしょうか?

プロセス起動した後に無反応になる?
プロセス終了した後に表示されるべきメッセージが表示されない?
プロセス起動できない?
起動したffmpeg.exeが終了しても戻ってこない?

参考ページではcmd.exeに/cオプションを指定しているようですが、
変更されたソースでは指定していないようで…。
その場合、
p.WaitForExit();
でちゃんと戻ってこれるんですかね?
# 起動したcmd.exe自体は終了していないはずですが…
# /Cも/Kも無かった場合ってどういう動作するんですかね?(Windows7 Pro 64Bitでcmd dirとしたら無視されてしまいましたが)

cmd.exe経由でなくても、必要条件満たせばffmpeg.exeの起動は可能と思いますよ。
ffmpeg.exeを利用するフロントエンドアプリなんかもそうしているでしょうし。
「ffmpeg.exe フロントエンド」で検索してみるとアプリは見つかるかと。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私の説明がたりませんでしたね。追記で書かせていただきます。

上記のプログラムは
p.StartInfo.Argumentsに値を入れることでプロンプトにコマンドを入力して、p.Start()でプロンプトで処理を実行し、string results = p.StandardOutput.ReadToEnd();でその結果を読み取るものだと思います。

しかし
p.StartInfo.Arguments = "\"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";
と入力して実行すると、プロンプトは立ち上がるのですが、立ち上がるだけでコマンドが入力されないんです。ビルドすると未入力のコマンドプロンプトが立ち上がって処理が止まってしまう感じです。

/cは処理後にプロンプトを閉じるコマンドのようですので単純化するために除去しました、"dir c:\"だと成功するので必ずしも必要無いと思いました。

ちなみに以下のように/cをつけて実行するとエラーになりました。「ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています」というエラーになりました。

p.StartInfo.Arguments = "/c \"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";

お礼日時:2015/08/03 16:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qc# でListと似たものを作りたい

c#初心者です。

c#のList<T>などのコレクションのように動的かつ高速に配列の容量を変更できるクラスを作りたいのですが、Listの構造すら分からないわ、普通の配列で色々やってみて上手くいかないわで困っています。

要はListやDictionaryがもつAddメソッドの基本的な内容が分かれば良いのですが、どなたか教えていただけないでしょうか?

Aベストアンサー

早いかどうか知らないけれど、

MSの.NET FrameworkではなくMonoでよければ
>要はListやDictionaryがもつAddメソッドの基本的な内容が分かれば良いのですが、どなたか教えていただけないでしょうか?
これは可能。

https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/List.cs
とか
https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/Dictionary.cs
を参考にしてみる手もあるのかな?

QC# コマンドプロンプト画面で表示された文字の取得

Windowsフォームアプリケーションからコマンドプロンプトを起動して、コマンドを実行した際に出る出力をフォームアプリケーション側から受け取ろうとしています。

テスト内容では成功するのですが、受け取りたい対象の内容は取得できずに困っています。
例えばコマンドプロンプト上で hoge と入力し実行すると

「'hoge' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

と表示されます。
しかし、前述カッコ内の表示をアプリケーション側から受け取ることが出来ませんでした。
どのようにすれば受け取ることができるでしょうか?
単純な path などを実行した場合は受け取れました。
以下が試した内容です。

Process ps = new Process();
ps.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec");
ps.StartInfo.Arguments = @"/C hoge";
ps.StartInfo.UseShellExecute = false;
ps.StartInfo.RedirectStandardOutput = true;
ps.StartInfo.CreateNoWindow = true;
ps.Start();
string output = ps.StandardOutput.ReadToEnd();
ps.WaitForExit();
ps.Dispose();

MessageBox.Show(output);//空の内容しか表示されない
//テストで hoge を path にした際はシステム環境変数が表示された


・環境
Windows 7 Professional 64bit
VC# 2010 Express

よろしくお願いいたします。

Windowsフォームアプリケーションからコマンドプロンプトを起動して、コマンドを実行した際に出る出力をフォームアプリケーション側から受け取ろうとしています。

テスト内容では成功するのですが、受け取りたい対象の内容は取得できずに困っています。
例えばコマンドプロンプト上で hoge と入力し実行すると

「'hoge' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

と表示されます。
しかし、前述カッコ内の表示をアプリケーション側から受...続きを読む

Aベストアンサー

「'hoge' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

だったら、たぶん標準エラー出力に出力されてると思うんですが。

Qストアアプリ開発 C# ListViewについて

ストアアプリ開発 C#初心者です。

サーバーからデータ取得後、
ListViewにデータを追加したいのですがよくわかりません。
ListViewに表示させたいのは日付、タイトル、画像です。


xaml↓
<ListView Grid.Row="1" x:Name="ListView1"></ListView>

C#
foreach (var item in blog_list){
ListViewItem addItem = new ListViewItem();

addItem.Tag = item.GetObject().GetNamedString("id");
addItem.Content = item.GetObject().GetNamedString("name");

ListView1.Items.Add(addItem);
}

本当に初心者で申し訳ないのですがわかりやすい
解説等してるサイトありましたら教えてください。

Aベストアンサー

JavaScriptでWindowsストアアプリ作成を試しているところです。C#だとGUIがXAMLなので多少違いはありますが、基本的な仕組みは同じようですね。

いくつかの項目を用意して表示したいのであれば、<ListView>の中に、例えば<x:string>などで表示する項目を用意しておく方法や、テンプレートを定義しておく方法などいくつかやり方があるようです。C#はあまり詳しく知らないのですが、以下のページをチェックすれば基本的なやり方はわかるんじゃないでしょうか。

http://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/hh780650.aspx

Qコマンドプロンプトのコマンドを使ってバッチファイルを作ってみたいのですが

プログラミングについてはコマンドプロンプトでバッチファイル(ログファイルの作成など)を何度か作成したことのあるだけの初心者なのですが、
バッチファイルは簡単で幅広い実用性があるように感じています。
 コマンドプロンプトを使ったバッチファイルでどのようなことができるのか実用例が載っている本を探しています。
 これは役に立つ!という本がありましたら是非教えていただけませんか?

Aベストアンサー

バッチファイルの解説本は10年くらい前は結構ありましたが、ここ数年はほとんど出版されていません。
多くが絶版になっていると思います。

バッチファイルで済む内容ならバッチファイルでやったほうが簡単なので今でも使うことはあります。
覚えても損はありませんが、変数の使い方,IF,FORあたりの肝となる部分を覚えればバッチファイルの守備範囲としては十分かと。
わざわざ本を探して買わなくとも、ネットで調べる程度でいいと思います。

ちょっと凝った内容になると役不足になるので、これから覚えるのならVBScriptがExcelやWordでも応用できてオススメです。

QC#にてlistView1からXMLファイルへ書込み方法について

C#にてlistView1からXMLファイルへ書込み方法について

1  2  3  4 5 6 7 8
1 Aさん 50 男
2 Bさん 40 女
3 Cさん 60 男

と書かれていて
XMLファイルの中身は、
<?xml version="1.0" encoding="utf-8"?>
<Data>
<p id="1" name="Aさん" age="50" seibetu="男"></p>
</Data>

この様なXMLファイルでlistView1にあるデータを全て書込みしたいのですが、どうしたら出来ますか?
どなたか申し訳ありませんが、プログラムソース教えて戴けませんか?お願いいたします。

Aベストアンサー

出力が少し異なりますが…

ボタンを設置し、それをクリックするとxmlファイルを書き出す設定にしています。
using System.XML; を追加する必要があります。


private void button1_Click(object sender, EventArgs e)
{
//XMLファイル名
string fName = @"C:\person.xml";

XmlTextWriter writer = new XmlTextWriter(fName, Encoding.UTF8);
writer.Formatting = Formatting.Indented;

writer.WriteStartDocument(true);
writer.WriteStartElement("Data");

int iCount = listView1.Items.Count;
string id, name, age, sex;
for(int i=0; i<iCount; i++){
id = listView1.Items[i].SubItems[0].Text;
name = listView1.Items[i].SubItems[1].Text;
age = listView1.Items[i].SubItems[2].Text;
sex = listView1.Items[i].SubItems[3].Text;

writer.WriteStartElement("p");
writer.WriteAttributeString("id", id);
writer.WriteAttributeString("name", name);
writer.WriteAttributeString("age", age);
writer.WriteAttributeString("sex", sex);
writer.WriteEndElement();
}

writer.WriteEndElement();
writer.WriteEndDocument();

//閉じる
writer.Close();
}


-----------------------------------------------------
出力ファイルの内容:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Data>
<p id="1" name="A" age="50" sex="男" />
<p id="2" name="B" age="40" sex="女" />
<p id="3" name="C" age="60" sex="男" />
</Data>

出力が少し異なりますが…

ボタンを設置し、それをクリックするとxmlファイルを書き出す設定にしています。
using System.XML; を追加する必要があります。


private void button1_Click(object sender, EventArgs e)
{
//XMLファイル名
string fName = @"C:\person.xml";

XmlTextWriter writer = new XmlTextWriter(fName, Encoding.UTF8);
writer.Formatting = Formatting.Indented;

writer.WriteStartDocument(true);
writer.WriteStartElement("Data");

int iCount = listView1.Items.Count...続きを読む

QC#でのbatファイル実行結果取得

既存のbatファイルが存在し、C#プログラムより、実行結果コ-ドを取得したいのですが、どうやっても「0」が帰ってきましまい、悩んでいます。 よいアドバイス&指摘を下さい。

<batファイル>
 @echo off
 set RET_CODE=%1
 echo %RET_CODE%
 exit /b %RET_CODE%

<C#プログラム>
 ProcessStartInfo psInfo = new ProcessStartInfo();
 psInfo.FileName = @"D:/app/Send.bat";
 psInfo.Arguments = "45";
 psInfo.CreateNoWindow = true;
 psInfo.UseShellExecute = false;
 psInfo.RedirectStandardOutput = true;
 Process ps= Process.Start(psInfo);
 string st = ps.StandardOutput.ReadToEnd(); ← 何も出ない?
 ps.WaitForExit();
 string rt = ps.ExitCode.ToString(); ← 必ず「0」が返却?

既存のbatファイルが存在し、C#プログラムより、実行結果コ-ドを取得したいのですが、どうやっても「0」が帰ってきましまい、悩んでいます。 よいアドバイス&指摘を下さい。

<batファイル>
 @echo off
 set RET_CODE=%1
 echo %RET_CODE%
 exit /b %RET_CODE%

<C#プログラム>
 ProcessStartInfo psInfo = new ProcessStartInfo();
 psInfo.FileName = @"D:/app/Send.bat";
 psInfo.Arguments = "45";
 psInfo.CreateNoWindow = true;
 psInfo.UseShellExecute = false;
 psInfo.Redi...続きを読む

Aベストアンサー

追記の追記。

psInfo.FileName = @"D:/app/Send.bat";
psInfo.Arguments = "45";
と書くと、実は
psInfo.FileName = @"C:\WINDOWS\SYSTEM32\CMD.EXE";
psInfo.Arguments = @"D:/app/Send.bat 45";
と言うように「CMD.EXEが起動するように、Windowsが小細工をする」のです。

そのため、Send.batは「子プロセスのCMD.EXEが実行」します。

その為
exit /b 終了コード
と書くと、この終了コードは「子プロセスとして動いているCMD.EXEのERRORLEVELになるだけで、CMD.EXEの終了コードにはならない」のです。

そして、Send.batを実行し終わった子プロセスのCMD.EXEは「これ以上、もう、何もする事がなく、正常終了してしまう」ので「正常終了時の終了コードとして0で終了」します。

終了コードが0で終了すれば、当然
ps.ExitCode
の値は「常に0」です。

そういう訳で「子プロセスとして動いているCMD.EXEを終了させ、終了コードを持たせる」には
exit 終了コード
と書いて「/b無しのexitコマンドを実行」しなければなりません。

こうすれば「Send.batを起動した子プロセスのCMD.EXEの終了コードが、exitコマンドで指定した値になる」のです。

exitコマンドで指定した値が終了コードになれば、当然
ps.ExitCode
の値も「引数で渡した値」になります。

追記の追記。

psInfo.FileName = @"D:/app/Send.bat";
psInfo.Arguments = "45";
と書くと、実は
psInfo.FileName = @"C:\WINDOWS\SYSTEM32\CMD.EXE";
psInfo.Arguments = @"D:/app/Send.bat 45";
と言うように「CMD.EXEが起動するように、Windowsが小細工をする」のです。

そのため、Send.batは「子プロセスのCMD.EXEが実行」します。

その為
exit /b 終了コード
と書くと、この終了コードは「子プロセスとして動いているCMD.EXEのERRORLEVELになるだけで、CMD.EXEの終了コードにはならない」の...続きを読む

QC#でListとDictionaryの判別方法

C# 2010 version 4.0を使用しています。

例えばaという変数があったとして
aがList<(この中の方はなんでも)>型なのか
Dictionary<(この中の方はなんでも), (この中の方はなんでも)>型なのか
判別する方法はどのように記述すれば良いのでしょうか?

if (aがList型の場合) {
}
else if (aがDictionary型の場合) {
}

Aベストアンサー

aからオープンジェネリック型のTypeを取得して,それがリストであるかを比較する,というような形になります。
if (a == null)
{
// a は null
}
else
{
var type = a.GetType();
if (!type.IsGenericType)
{
// a はジェネリック型ではない == List<T>でもDictionary<TK, TV>でもない
}
else
{
var openType = type.GetGenericTypeDefinition();
if (openType == typeof(List<>))
{
// a はList<T>
}
else if (openType == typeof(Dictionary<, >))
{
// a はDictionary<TK, TV>
}
else
{
// a はその他のジェネリック型
}
}
}

QC#で実行形式ファイル(*.exe)を起動したい

C#で実行形式ファイル(*.exe)を起動したいのですが、以下のようにしました。
しかし、うまくいきません。なぜでしょうか?

コマンドプロンプトから実行すればまったく同じ引数でもうまくいきます。
したがって引数の書式に問題があるとは思えません。

これを実行するとコマンドプロンプトのウィンドウが表示され2秒後に消えます。
しかし、作成されているべきふたつのファイル(rangeとtrain.scale)が作成されていません。

急いでいます。
よろしくお願いいたします。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try{
Process myProcess ;
myProcess = Process.Start(@"C:\Users\youzan\svm-scale.exe", @"-l -1 -u 1 -s           range train.txt > train.scale");

Thread.Sleep(2000);

myProcess.CloseMainWindow() ;
myProcess.Close();
}
catch(Exception e)
{
Console.WriteLine("The following exception was raised: ");
Console.WriteLine(e.Message);
}
}
}
}

C#で実行形式ファイル(*.exe)を起動したいのですが、以下のようにしました。
しかし、うまくいきません。なぜでしょうか?

コマンドプロンプトから実行すればまったく同じ引数でもうまくいきます。
したがって引数の書式に問題があるとは思えません。

これを実行するとコマンドプロンプトのウィンドウが表示され2秒後に消えます。
しかし、作成されているべきふたつのファイル(rangeとtrain.scale)が作成されていません。

急いでいます。
よろしくお願いいたします。

using System;
using System.Collections...続きを読む

Aベストアンサー

> train.scale

そもそも、これはコマンドライン引数ではありません。

C#側で標準出力をうけるのであれば、
http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html

QC# listviewでサブアイテムを順番に抽出

C#のlistviewで例えば中身が下記の様になっているとします。
AAA,AAA,1,AAA
BBB,BBB,2,BBB
CCC,CCC,6,CCC
DDD,DDD,3,DDD

SubItems[2]の数字を予め設定した引数str1,str2,str3,str4にlistviewの上から順番に当てはめたいです。
str1=1
str2=2
str3=6
str4=3
こんな感じにしたいです。
上手く説明できているか不安ですが、ご教授頂ければありがたいです。

Aベストアンサー

str1=listview1.Items[0].SubItems.item[2];
str2=listview1.Items[1].SubItems.item[2];
str3=listview1.Items[2].SubItems.item[2];
str4=listview1.Items[3].SubItems.item[2];
ってところでしょうか?

","区切りでそれぞれのSubitemに入っている場合…ですけどね。
# SubItems[2]って言っているくらいですから、そこらヘンは理解されていると思いますが。

QBatファイルを実行した際のコマンドプロンプト

Batファイルを実行した際のコマンドプロンプトの表示をさせたくないのですが、よい方法はありますでしょうか?
ご教授お願いします。

Aベストアンサー

間接的にVBScriptから起動すれば、ウィンドウ非表示で、実行できます。
例えばこんな感じ
以下のファイルをRunBat.vbs など適当な名前で保存する
----------------------------------------------------------------
Dim oShell
Set oShell = WScript.CreateObject ("WScript.Shell")
oShell.run "実行したいバッチファイル.bat", 0
Set oShell = Nothing


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング