DirectShow - C#

 ( MysteryKe | 2008. február 25., hétfő - 2:56 )

Szasztok!

Nem találtam kizárólag C#-al foglalkozó fórumtémát, a C/C++ -ba meg nem akartam nyitni.
C-t tanultam, C++ -t meg szívesebben tanulnék, de a suliban most C#-ozunk sajna... na mind1, ez van.

Szal...
Készülök a vizsgaprogimra, amely egy primitív videószerkesztő lesz majd és AviSínth kódot fog tudni generálni.
Na a problémám pillanatnyilag az, hogy hogyan tudnám a klippeket képkockaszerint elérni?
Tehát hogy a lejátszás kezdődjön mondjuk a 2500-ik képkockánál, és az 5000-nél fejeződjön be.
Microsoft Visual C# 2005 Express Edition fejlesztőkörnyezetben dolgozom, böngészgettem az MSDN-t is meg átnézegettem nagyjából a függvény referenciákat, de a CurrentPosition is másodpercben kapom vissza és nem képkockában. (pl.: CurrentPosition: 42,234422341 másodperc, és ez egy kicsit kényelmetlenné teszi a pozicionálást, főleg, mert 1 mp = 25 képkocka,ami azért számít(!!Kizárólag PAL rendszerben dolgozok!!))
Tudna valaki vmi ötletet adni, hogy hogyan lehetne DirectShow-ban mégis a klippek részleteire képkockákban hivatkozni?

Köszi:
MysteryKe.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

IMediaPosition-t használsz, és nem IMediaSeeking-et, ugye?
utóbbi tudja, amit szeretnél

+1
ld.: "The IMediaSeeking interface improves on the IMediaPosition interface by allowing arbitrary formats for seekable units, such as frames, bytes, and 100-nanosecond units of time."
Szerintem itt elkezdhetsz nézelődni (pl. érdemes előtte IMediaSeeking::GetCapabilities-t is megnézni, hogy lehet-e pozicionálni adott médiumot stb.)

igazából nem használtam IMediaSeeking-et, sem IMediaPosition-t

---------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX.AudioVideoPlayback;

namespace DS_proba
{
public partial class Form1 : Form
{
private string movie = @"E:\premiere\Untitled Clip 01 01.avi";
private Video av;
private IMediaSeeking msAV;
private float r;
private string s;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
av = new Video(movie);
av.Owner = panel1; // can be ANY Windows.Forms control; Button works, eg

av.Play();
timer1.Enabled = true;

}

private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = av.CurrentPosition.ToString(); //Másodpercben írja ki.
}
}
}

Itt is működhetne az átszámítási trükk (ld. hivatkozott lap) - ha már tudod, hogy a CurrentPosition milyen értéket ad vissza, ill. tudod a frame/sec arányt, akkor kiírathatod azt is, hányadik frame-ről van szó. Bár akkor ugyanott leszel, mint eredetileg :( (kerekítés).
Ezért lenne érdemesebb böngészni az IMediaSeeking doksijait.