導入
OpenHarmonyでの動画アプリケーション開発において、動画のタイトルやサムネイル、再生時間、ストリームURLなどの情報を直接取得する必要があるケースが存在します。複雑なAPI制限を避けるため、youtube_explode_dartというDart製のパッケージが有効です。このライブラリはクライアント側のプロトコルシミュレーションにより、動画データを構造化されたオブジェクトに変換します。主要なAPIの使用例
2.1 クライアント初期化
import 'package:youtube_explode_dart/youtube_explode_dart.dart';
// 💡 使用後はclose()でリソースを解放することを推奨
final client = YoutubeExplode();
2.2 動画メタデータの取得
void fetchMetadata(String url) async {
// 1. 動画オブジェクトの取得
final video = await client.videos.get(url);
print('タイトル: ${video.title}');
print('投稿者: ${video.author}');
print('動画長さ: ${video.duration}');
print('サムネイル: ${video.thumbnails.highResUrl}');
}
2.3 再生可能なストリームURLの取得
void getStreamUrl(String videoId) async {
// 1. 動画ストリーム一覧の取得
final manifest = await client.videos.streamsClient.getManifest(videoId);
// 2. 最高品質のMP4混合ストリームの取得
final streamInfo = manifest.muxed.withHighestVideoQuality();
if (streamInfo != null) {
print('実際のストリームURL: ${streamInfo.url}');
print('動画形式: ${streamInfo.container}');
print('ファイルサイズ: ${streamInfo.size}');
}
}
主な応用例
3.1 第三者動画クライアント構築
解析結果をもとに動画リストを構築し、ストリームURLをvideo_playerに渡して再生可能です。3.2 動画素材のプレビュー機能
URLを貼るだけで自動的にサムネイルとタイトルを表示するカード型UIを構築可能です。OpenHarmonyプラットフォームの最適化
4.1 ネットワーク性能改善
解析処理は複数回のHTTPリクエストを伴います。OpenHarmony端末ではFuture.waitで並列処理を推奨します。またmodule.json5にohos.permission.INTERNETの権限を宣言してください。
4.2 動画再生の最適化
OpenHarmonyのH.264/MP4デコード機能は優れており、youtube_explode_dartで取得したmuxedストリームはハードウェアアクセラレーションに対応しており、CPU負荷を大幅に軽減できます。
完全な実装例:OpenHarmony動画解析エンジン
import 'package:youtube_explode_dart/youtube_explode_dart.dart';
class OhosMediaParser {
final _client = YoutubeExplode();
Future<void> analyzeMedia(String url) async {
print('🚀 OpenHarmony高速解析モジュール起動中...');
try {
// 1. メタデータ取得
final video = await _client.videos.get(url);
print('📺 対象動画:${video.title}');
// 2. ストリーム情報取得
final manifest = await _client.videos.streamsClient.getManifest(video.id);
// 3. 最適な720p以下を選択
final stream = manifest.muxed.bestQuality;
print('✅ 解析成功!');
print('推奨再生URL:${stream.url}');
print('予想バッファサイズ:${stream.size.megaBytes.toStringAsFixed(2)} MB');
} catch (e) {
print('❌ 解析失敗:ネットワーク接続を確認してください');
} finally {
_client.close(); // 💡 必ずclose()を呼び出すこと
}
}
}
void main() async {
final parser = OhosMediaParser();
await parser.analyzeMedia("https://www.youtube.com/watch?v=xxxxxxxx");
}