2009-12-19 5 views
0

안녕하세요 여러분 wpf에 관해서는 상당히 초록색입니다. 그래서 약간의 도움이 필요합니다.Wpf 사용자 지정 미디어 요소

맞춤 미디어 요소를 만들고 싶습니다. 동영상을로드하고 15 초에서 1 분 사이의 동영상을 재생할 수 있기를 원하면 동적으로로드를 설정할 수 있기를 원합니다. 사용자 설정. 수 많은 동영상을 기본적으로 목록보기 컨트롤에로드하고 동영상을 재생하고 싶지만 동영상의 작은 미리보기 만 재생하여 리소스를 절약하려고합니다.

것들 내가

  • 사용자 지정 컨트롤로 검토 한 - 다소
  • 사전 제어 다음 이동 위치에 대한

임 정말 확신을 구축 서브 클래스

  • 을 잃었다. 나는 네가 나에게 줄 수있는 어떤 도움이라도 크게 appericate 것이다.

  • +0

    미리보기 비디오를 다운로드 할 무언가를 만들려고하고 있습니까? 예를 들어 다음과 같은 일정을 처리 할 수 ​​있습니까? 창을 지우고 전체 비디오를 다운로드하고 재생할 수 있습니까? 또는 전체 비디오를 다운로드하지만 처음에는 조각 만 재생할 수 있습니다 (그러나 전체 비디오를 재생하는 방법이 있습니까)? 아니면 중간 행동? 원하는 것을 얻기 위해 다양한 방법이있을 수 있지만 사용자 정의 요소의 작동 방식에 따라 달라집니다. – itowlson

    +0

    지금 내가하고있는 일은 비디오 폴더를 반복하면서 미디어 요소를 scrollviewer의 측면에있는 스택 패널에 추가하는 것입니다. 따라서 약 5 ~ 20 개의 vids가있을 수 있으므로 키오스크 앱을 제작하려고하므로 동영상 수가 다를 수 있습니다. 나의 초기 생각은 15secs-1 분 사이의 비디오 재생을 반복하는 것입니다. 이 방법은 사용자가 비디오가 아니라 그림을 알 수 있습니다. (저는 그것에 대한 별도의 스크롤 뷰어가 있습니다). 하드웨어가 달라지기 때문에이 프로그램에서 소비 할 리소스를 줄이려고합니다. 동영상을 찍으려고하는 것은 갈 길이 멀지 않을 수도 있습니다. Idk, 아마도 더 나은 스레딩입니까? – nagates

    답변

    1

    요구 사항에 대한 의견이 있으시면 일반 MediaElement를 사용 하시겠지만 제안하려는 부분 만 포함하고 해상도는 줄인 "미리보기"버전의 비디오를 할당하는 것이 좋습니다. 적재량을 줄이십시오.

    따라서 모델에는 PreviewUri와 SourceUri라는 두 가지 속성이 있습니다. PreviewUri에서 비디오의 "미리보기"버전을 저장합니다. SourceUri에서 "전체"버전을 저장합니다. ListBox 또는 ItemsControl에서 PreviewUri에 바인딩 된 MediaElements를 사용합니다. 사용자가 선택하면 기본 MediaElement의 Source를 SourceUri로 설정합니다.

    <ListBox ItemsSource="{Binding}"> 
        <ListBox.ItemTemplate> 
        <DataTemplate> 
         <MediaElement Source="{Binding PreviewUri}" /> 
        </DataTemplate> 
        </ListBox.ItemTemplate> 
    </ListBox> 
    

    모델은 다음과 같이 보일 것입니다 : 그래서 당신의리스트 박스는 다음과 같이 보일 것입니다

    public class Video // ideally implement INotifyPropertyChanged - not shown 
    { 
        public Uri PreviewUri { get; set; } 
        public Uri SourceUri { get; set; } 
    
        public static ObservableCollection<Video> LoadVideoInfo() 
        { 
        /* pseudocode 
        new up a collection 
        foreach (file in videoFolder) 
         collection.Add(new Video { PreviewUri = smallFileUri, SourceUri = bigFileUri }); 
        return collection; 
        */ 
        } 
    } 
    

    및 코드 뒤에 같은 것을 볼 것이다 :

    DataContext = Video.LoadVideoInfo(); 
    

    방법을 전체 크기의 비디오를 표시하려면이 옵션을 실행하려는 대상과 전체 크기의 비디오가 표시되는 위치에 따라 달라집니다. ListBox를 반복하지 않고 StackPanel에 자식을 추가하는 것은 SelectedItemChanged 이벤트를 사용하거나 SelectedItem에 데이터 바인딩을 사용하거나 IsSynchronizedWithCurrentItem 속성을 사용할 수 있기 때문에이 작업에 도움이 될 수 있습니다.

    +0

    그래서 mediaElement 객체가 자체 스레드를 시작합니까? 왜냐하면 재생에 대한 나의 다른 생각 때문입니다. – nagates

    +0

    죄송합니다. 내부적으로 스레드를 관리하는 방법을 모르겠습니다.그러나 UI 스레드를 소유하고있는 스레드에서만 UI 요소와 상호 작용할 수 있기 때문에 스스로 백그라운드 스레드를 만드는 것은 힘들 수 있습니다. 또한 WPF 미디어 클래스 (MediaElement, MediaPlayer 및 MediaTimeline은 Uri 유형의 Source 속성 만 표시하므로 사용자가 비동기 적으로로드 한 데이터를 어떻게로드 할 수 있는지 명확하지 않으며 사용자 지정 URI 스키마 등을 만들지 못합니다. – itowlson