簡単にjavaビデオプレーヤーを作ることを教えます。
前言
むだ話を飛ばして直接本文を読む。
その年にJavaに入ったのはプラットフォームにまたがる優勢のためです。その時は「一度編纂して、至るところで実行する」と思います。これはどんなに牛が強いかと聞いて、すべての言語の発展の究極の道であるべきです。javaはきっと天下を統一します。
しかし、その時の私はまだ若すぎるという事実が証明されました。
魚と熊の手のひらは互換できないということです。プラットフォームをまたいで持ってくる便利さを享受するには、性能上の不足を受け入れることが避けられません。実際には、Javaは仮想マシンの性能向上(JITなどの技術)に力を入れていますが、リアルタイムの計算性能に対する要求が高く、またはハードウェアで最適化されたタスク(ビデオのハードウェア符号化、復号)に関連する場合は、cまたはc++++にははるかに及ばないです。そのため、Javaを使ってこのようなソフトウェアを書く人はあまり見られません。
本題に戻って、ビデオプレーヤーを書きたいなら、必ず違ったビデオフォーマット(mp 4、avi、rmvb、flivなど)を処理します。各種類のフォーマットのビデオは対応するデコーダがなければ再生できない。ほとんどのデコーダのライブラリは、効率の高いcまたはc+に基づいて書かれており、Javaでデコーダを書くライブラリは非常に少ない。
したがって、javaでビデオプレーヤーを書くには、次の二つの選択しかないです。
•純粋なjavaを使って編集して、自分で主流のビデオフォーマットのソフトウェアのデコーダを編纂して、Javaメディアのフレームワーク(JMF)を結び付けてビデオの復号の任務を完成します。
•jniを使用して既存のcまたはc++のデコーダライブラリを呼び出し、ビデオ復号のタスクを完了します。
Javaを使って自分でソフトウェアデコーダを作るメリットは、実際にクロスプラットフォームを実現することができ、また、swingフレームワークとの結合にも便利であることです。しかし、欠点はあまりにも面倒くさいです。ソフトウェアデコーダの効率問題はともかく、様々な主流のビデオフォーマットのデコーダの車輪が成功的に再構築できるかどうかは、議論に値する問題です。
したがって、私は第二の方法を採用しました。jniを通じて既存の第三者ビデオ復号ライブラリを呼び出してビデオ復号のタスクを完了します。ビデオの表示、制御のロジックはjavaに任せて完成します。これにより、より効率的なビデオプレーヤーを実現することができる。特に、プラットフォームの種類によって異なるプラットフォームを呼び出してもクロスプラットフォームを実現することができますが、多くの制限を受けることは避けられません。
次に、具体的にどのようにビデオプレーヤーを実現するかを見てみましょう。
本文
デコーダの選択
ビデオフォーマットは多く、デコーダも多いので、それぞれ対応するデコーダを探してjniインターフェースにカプセル化して呼び出しを行うのは複雑なタスクです。したがって、複数の主流デコーダが実装されているメディア処理フレーム(ビデオプレイヤー)のライブラリを探して直接呼び出します。VLCはとてもいい選択です。
VLC media player VLCは、自由でオープンソースのマルチメディアプレーヤーとフレームワークであり、大多数のマルチメディアファイルを再生することができ、DVD、オーディオCD、VCD及び各種ストリームメディアプロトコルである。
vlcのライブラリでは、jniで一定のカプセル化を行い、Javaでビデオの復号と再生制御インターフェースを呼び出すことができます。幸いにも私たちは車輪を作り直す必要がないです。vlcjは海外の開発者がjavaで開発したメディア処理の枠組みであり、最下部ではvlcプレイヤーを使って、jniがvlcを呼び出してオーディオの復号化を完了します。
開発プロセス
•VLC Media Playerをインストールします。(私がインストールしたバージョンは2.2.4です。デフォルトのディレクトリにインストールしたほうがいいです。)
•一般的なmaven項目を作成し、vlcjの依存を追加します。
次はコードドライです。三つの項目を紹介します。全部このvlcjに基づくビデオプレーヤーです。
入門の例
これはvlcjの著者が提供する入門例示的なプログラムであり、簡単なビデオプレーヤを迅速に実現することができます。もちろん、再生するだけで、制御機能を提供しません。
ここで使用するvlcjで提供される埋め込みビデオ再生コンポーネントEmbodMediaPlayer Componentは、その中のmediaPlayerのplayMedia方法で直接ビデオを再生でき、ビデオはEmbodMediaPlayer Componentにレンダリングされます。EmbodMediaPlayer Componentというコンポーネントは他の多くの機能を提供しています。普通のビデオプレーヤーを実現するなら、このコンポーネントを理解すれば十分です。
コード
これはvlcjの作者自身がvlcjに基づいて書いたオープンソースプレーヤーで、機能が全面的で、いつものビデオプレーヤーとして使用できる。このプロジェクトは内容が多いので、コードをリストするのは不便です。
プロジェクトの住所はhttps://github.com/caprica/vlcj-playerをご参照ください。
javaplayer
これは私がvlcjに基づいて書いた簡単なビデオプレーヤーで、いくつかの簡単なビデオ再生制御機能と弾幕再生機能をサポートします。
このプレーヤーを開発したのはjavaのビデオプレーヤー作成に対する好奇心からで、比較的に完璧な機能を提供していません。ただ私が以前書いた弾幕プレーヤと結び付けて、このビデオプレーヤのために弾幕再生の機能を追加しました。地元の動画を再生する過程でb駅の弾幕を再生することができます。
プロジェクトの住所はhttps://github.com/clayandgithub/javaplayerをご参照ください。
後記
開発の過程で、ビデオレンダリングコンポーネントの透明性の問題や、swingの再描画機構によるいくつかのインターフェース表示上のbugに遭遇しました。一部は完全に解決されました。一部は曲線救国の方法で解決しただけです。もしあなたが運転中にこれらの問題があったら、一緒に交流して検討してください。
付:vlcjの公式文書
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
むだ話を飛ばして直接本文を読む。
その年にJavaに入ったのはプラットフォームにまたがる優勢のためです。その時は「一度編纂して、至るところで実行する」と思います。これはどんなに牛が強いかと聞いて、すべての言語の発展の究極の道であるべきです。javaはきっと天下を統一します。
しかし、その時の私はまだ若すぎるという事実が証明されました。
魚と熊の手のひらは互換できないということです。プラットフォームをまたいで持ってくる便利さを享受するには、性能上の不足を受け入れることが避けられません。実際には、Javaは仮想マシンの性能向上(JITなどの技術)に力を入れていますが、リアルタイムの計算性能に対する要求が高く、またはハードウェアで最適化されたタスク(ビデオのハードウェア符号化、復号)に関連する場合は、cまたはc++++にははるかに及ばないです。そのため、Javaを使ってこのようなソフトウェアを書く人はあまり見られません。
本題に戻って、ビデオプレーヤーを書きたいなら、必ず違ったビデオフォーマット(mp 4、avi、rmvb、flivなど)を処理します。各種類のフォーマットのビデオは対応するデコーダがなければ再生できない。ほとんどのデコーダのライブラリは、効率の高いcまたはc+に基づいて書かれており、Javaでデコーダを書くライブラリは非常に少ない。
したがって、javaでビデオプレーヤーを書くには、次の二つの選択しかないです。
•純粋なjavaを使って編集して、自分で主流のビデオフォーマットのソフトウェアのデコーダを編纂して、Javaメディアのフレームワーク(JMF)を結び付けてビデオの復号の任務を完成します。
•jniを使用して既存のcまたはc++のデコーダライブラリを呼び出し、ビデオ復号のタスクを完了します。
Javaを使って自分でソフトウェアデコーダを作るメリットは、実際にクロスプラットフォームを実現することができ、また、swingフレームワークとの結合にも便利であることです。しかし、欠点はあまりにも面倒くさいです。ソフトウェアデコーダの効率問題はともかく、様々な主流のビデオフォーマットのデコーダの車輪が成功的に再構築できるかどうかは、議論に値する問題です。
したがって、私は第二の方法を採用しました。jniを通じて既存の第三者ビデオ復号ライブラリを呼び出してビデオ復号のタスクを完了します。ビデオの表示、制御のロジックはjavaに任せて完成します。これにより、より効率的なビデオプレーヤーを実現することができる。特に、プラットフォームの種類によって異なるプラットフォームを呼び出してもクロスプラットフォームを実現することができますが、多くの制限を受けることは避けられません。
次に、具体的にどのようにビデオプレーヤーを実現するかを見てみましょう。
本文
デコーダの選択
ビデオフォーマットは多く、デコーダも多いので、それぞれ対応するデコーダを探してjniインターフェースにカプセル化して呼び出しを行うのは複雑なタスクです。したがって、複数の主流デコーダが実装されているメディア処理フレーム(ビデオプレイヤー)のライブラリを探して直接呼び出します。VLCはとてもいい選択です。
VLC media player VLCは、自由でオープンソースのマルチメディアプレーヤーとフレームワークであり、大多数のマルチメディアファイルを再生することができ、DVD、オーディオCD、VCD及び各種ストリームメディアプロトコルである。
vlcのライブラリでは、jniで一定のカプセル化を行い、Javaでビデオの復号と再生制御インターフェースを呼び出すことができます。幸いにも私たちは車輪を作り直す必要がないです。vlcjは海外の開発者がjavaで開発したメディア処理の枠組みであり、最下部ではvlcプレイヤーを使って、jniがvlcを呼び出してオーディオの復号化を完了します。
開発プロセス
•VLC Media Playerをインストールします。(私がインストールしたバージョンは2.2.4です。デフォルトのディレクトリにインストールしたほうがいいです。)
•一般的なmaven項目を作成し、vlcjの依存を追加します。
<dependency>
<groupId>uk.co.caprica</groupId>
<artifactId>vlcj</artifactId>
<version>3.10.1</version>
</dependency>
•本開発次はコードドライです。三つの項目を紹介します。全部このvlcjに基づくビデオプレーヤーです。
入門の例
これはvlcjの著者が提供する入門例示的なプログラムであり、簡単なビデオプレーヤを迅速に実現することができます。もちろん、再生するだけで、制御機能を提供しません。
ここで使用するvlcjで提供される埋め込みビデオ再生コンポーネントEmbodMediaPlayer Componentは、その中のmediaPlayerのplayMedia方法で直接ビデオを再生でき、ビデオはEmbodMediaPlayer Componentにレンダリングされます。EmbodMediaPlayer Componentというコンポーネントは他の多くの機能を提供しています。普通のビデオプレーヤーを実現するなら、このコンポーネントを理解すれば十分です。
コード
package tutorial;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.discovery.NativeDiscovery;
public class Tutorial {
private final JFrame frame;
private final EmbeddedMediaPlayerComponent mediaPlayerComponent;
public static void main(final String[] args) {
new NativeDiscovery().discover();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Tutorial(args);
}
});
}
public Tutorial(String[] args) {
frame = new JFrame("My First Media Player");
frame.setBounds(100, 100, 600, 400);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
mediaPlayerComponent.release();
System.exit(0);
}
});
mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
frame.setContentPane(mediaPlayerComponent);
frame.setVisible(true);
mediaPlayerComponent.getMediaPlayer().playMedia(args[0]);
}
}
vlcj-playerこれはvlcjの作者自身がvlcjに基づいて書いたオープンソースプレーヤーで、機能が全面的で、いつものビデオプレーヤーとして使用できる。このプロジェクトは内容が多いので、コードをリストするのは不便です。
プロジェクトの住所はhttps://github.com/caprica/vlcj-playerをご参照ください。
javaplayer
これは私がvlcjに基づいて書いた簡単なビデオプレーヤーで、いくつかの簡単なビデオ再生制御機能と弾幕再生機能をサポートします。
このプレーヤーを開発したのはjavaのビデオプレーヤー作成に対する好奇心からで、比較的に完璧な機能を提供していません。ただ私が以前書いた弾幕プレーヤと結び付けて、このビデオプレーヤのために弾幕再生の機能を追加しました。地元の動画を再生する過程でb駅の弾幕を再生することができます。
プロジェクトの住所はhttps://github.com/clayandgithub/javaplayerをご参照ください。
後記
開発の過程で、ビデオレンダリングコンポーネントの透明性の問題や、swingの再描画機構によるいくつかのインターフェース表示上のbugに遭遇しました。一部は完全に解決されました。一部は曲線救国の方法で解決しただけです。もしあなたが運転中にこれらの問題があったら、一緒に交流して検討してください。
付:vlcjの公式文書
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。