前前回は動画データの送信にffserverを使用しましたが、送信側がLinuxでないとダメでした。
やっぱ、Windowsでないと使いにくいですね~('~')
何かいい方法ないかとGoogle先生に聞いてみると、ffmpegはデータ出力先を標準出力に出来るそうです。
さらに各種ログメッセージも出力しないようにできるとのこと。
なんか出来そうな気がしてきました。
ただ、現在よく使うffmpegのオプションだとエンコード速度が実時間より
6fps遅いので使い物になりません。
速度優先のための値っていくつにすればいいのかわからないんですよね~(´・ω・`)
そこで、またGoogle先生に聞いて、こんな感じにしてみました。
-g 250 -qcomp 0.6 -qmin 10 -qmax 51 -subq 1 -me_range 16 -i_qfactor 0.71
これだとAMD PhenomIIX6 1090T 3.2GHzの環境で
エンコード速度50fpsくらい出てくれて、ビットレートが10Mbpsくらいになります。
以下のJavaコードをサーブレットに組み込んで試してみると...
(コア部分のみ抜粋)
String path = "D:\\bin\\";
res.setStatus(200); // resはHttpServletResponse
res.setContentType("video/mpeg");
ArrayList<String> list = new ArrayList<String>();
list.add(path + "ffmpeg.exe");
list.add("-i");
list.add("abc2.ts");
list.add("-f");
list.add("mpegts");
list.add("-acodec");
list.add("copy");
list.add("-vcodec");
list.add("libx264");
list.add("-s");
list.add("1920x1088");
list.add("-g");
list.add("250");
list.add("-qcomp");
list.add("0.6");
list.add("-qmin");
list.add("10");
list.add("-qmax");
list.add("51");
list.add("-qdiff");
list.add("4");
list.add("-subq");
list.add("1");
list.add("-me_range");
list.add("16");
list.add("-i_qfactor");
list.add("0.71");
list.add("-threads");
list.add("8");
list.add("pipe:1");
list.add("-loglevel");
list.add("quiet");
ProcessBuilder pb = new ProcessBuilder(list);
pb.directory(new File(path));
Process p = pb.start();
InputStream is = p.getInputStream();
out = res.getOutputStream();
byte[] b = new byte[2048000];
while (true) {
int n = is.read(b);
if (n < 0) {
break;
}
out.write(b, 0, n);
}
動きましたヽ(´▽`)ノ
ただし、最初の30秒ほどはたまにつっかかりますねぇ。
その後は全く問題なく再生されていました。
あとはファイル名固定の部分やRaspberryPi側のファイル選択ツールを作成すれば
ため込んだTSファイル再生できますな(=´∇`=)
おまけ
omxplayerの操作方法は
http://omxplayer.sconde.net/
のKey bindingsの項目に書いてありました。
一時停止とかもできたんですね...知りませんでした(;´д`)
0 件のコメント:
コメントを投稿