STM32 SD Video Player

Başlatan Mucit23, 13 Şubat 2018, 22:17:53

Mucit23

Temel olarak bir video player yapmam gerekiyor. Bunun için fikir almak istedim. STM32 ve SD karttan FatFS ile okuyacağım video datalarını LCD de görüntülemem gerekiyor.

Daha önce STM32F4 ve TFT LCD ile kamera uygulamalarım için bir kart yapmıştım. Hazır çalışan bir LCD li donanım var. Ona SD kart ekleyerek Test düzeneğimi hazır hale getirebilirim.
FatFS işini hallettiğimi düşünürsek, Video Okuma işi hakkında bilgi verebilecek olan varmı?

Video Formatı önemli değil, İşimi kolaylaştıracak en kolay format hangisi ise o format üzerinde çalışmak istiyorum. Fakat FatFS ile bir video nasıl okunur, RGB pixel datalarına nasıl erişilir bilgim yok.

Bu konu nasıl yapılır anlatabilecek olan varmı? Bir örnek uygulamada işimi fazlasıyla görecek. Basit bir uygulama yapmaya çalışıyorum.

baran123

Ben sd karttan bmp uzantılı resim okuyup ekrana basmistim 429-Disco
İşin önemli noktası uğraşacagın formatı öğrenmek. Tabi Fatfs işi kolay önemli olan dosyanın formatı.
Basit bir format belirleyip bunu çözmeye çalışarak işe başlayabilirsiniz

Mucit23

Youtube da birkaç çalışma videosu var. Fakat ayrıntılı  bilgi yok, İncelenebilecek bir kod bulamadım henüz. O çalışmaların birinde mjpeg formatının kullanıldığını gördüm, ama arka planda ne tür çalışmalar var bilmiyorum tabiki.


Sesede gerek yok şimdilik. Sadece görüntü istiyorum.


Öncelikle Format işini belirlemem lazım. Raw olarak sıkıştırılmamış yada codec gerektirmeyen doğrudan RGB datalarına ulaşabileceğim video formatı hangisidir?

Mucit23

#3
Çok araştırdım ama internette hiçbir örnek bulamadım. Youtubeda birkaç uygulama gördüm ama döküman paylaşımı yok


Bu işi kendim yapmalıyım.  Öyle bir video formatı olmalıki, FatFS de Frame Frame RGB video datalarını okuyabileyim. Bu şekilde RAW olarak okuyabileceğim video formatı hangisidir? Bilgisayarda İstenilen Videoyu bu formata dönüştürüp SD karta atıp o şekilde okumayı hedefliyorum.

Ek olarak birde Ses işi var ama o ikinci planda, Video dosyasının içinde birde ses dataları var, Bunların ayrımı vs birçok soru işareti???

engineer

STMCube ve Keil FW paketleri içinde örnek kodlar var, ordan yola çıkabilirsin. Örneğin;
C:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP\2.11.0\Projects\STM32469I-Discovery\Demonstrations\Modules\videoplayer
C:\Users\KullanıcıAdı\STM32Cube\Repository\STM32Cube_FW_F4_V1.19.0\Projects\STM32469I_EVAL\Demonstrations\STemWin\Gui\Core\videoplayer

Mucit23

Evet baktım ona, O örnek baya karışık çıkamadım işin içinden, Videoyu nerede okuyor nasıl okuyor anlayamadım.  Fakat .emf diye bir format kullanıyor. Kodları incelerken bu dikkatimi çekti. Fakat bu format hakkında bilgiye erişemiyorum.


İlk önce şunu öğrenmek istiyorum. Raw RGB datalarına en kolay erişebileceğim video formatı hangisidir? Bununla ilgili anahtar kelimeler nelerdir? Raw Video format şeklinde araştırma yapınca google bana çok farklı şeyler öneriyor. 


Bunu belirledikten sonra dosya yapısını anlayıp ona göre SD karttan okuma yapmayı deneyeceğim.

makine_terbiyecisi

SD kart ile dosya okumayı hangi kütüphane ile yapıyorsunuz ?
# ÖĞRENELİM, ÖĞRETELİM #

Mucit23

Şurada Tilen'nin örneği var STM32F4 için
https://stm32f4-discovery.net/2014/07/library-21-read-sd-card-fatfs-stm32f4xx-devices/

STM32F4 ile yaparsam bunun üzerine giderim.

Sorumu tekrarlayayım.
Alıntı Yapİlk önce şunu öğrenmek istiyorum. Raw RGB datalarına en kolay erişebileceğim video formatı hangisidir? Bununla ilgili anahtar kelimeler nelerdir? Raw Video format şeklinde araştırma yapınca google bana çok farklı şeyler öneriyor.

controller

Ses zorunlu değil ise en kolayı gif formatıdır sanırım.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

baran123

Bence ilk olarak bildiğin formatlara bir bak (mp4 vs)
Sana yapısı en basit gelen ve MCU ile minimum işlem gücü kullanarak oynatacağın formatı bulup bunu çözmeye çalış.
Dosya formatlarının yapılarına bakarak buna başlayabilirsin.
Şu site yapıları oldukça güzel resmetmiş gibi duruyor.
http://www.file-recovery.com/mp4-signature-format.htm
Mesela ben JPEG gösterecektim fakat MCU ile iş yükü olacak diye BMP seçtim daha basit bir yapısı vardı.

Mucit23

Birde Mjpeg var. Movie Jpeg diye geçiyor. Birkaç kişi bu format ile birşeyler yapmış. Ama Ayrıntı yok

Şu arkadaşın yaptığı uygulama baya iyi. STM32F103 ile yapmış

https://www.youtube.com/watch?v=7-NHFz5MuoQ

Aklımdaki Temel Sorular

1-) SD karttan belirli bir boyutta veri okuduk diyelim. Video Datalarının nereden başladığını nerden öğreneceğim?
2-) Ses Datalarını nasıl ayırt edeceğim?

MP4 formatı bildiğim kadarıyla sıkıştırılmış bir format, Video datalarını düzgün bir şekilde okusam birde codec gerekecek sanırım. Bana Gif Mantıklı geldi. Fakat Gif'i okumak içinde gif dosya formatının yapısını bilmek gerekecek. Buna bakıyorum





Mucit23

Birde aklıma şu geldi.


Video dosyasını bir şekilde yapısını bildiğim bir formata dönüştürsem, Örneğin .bin dosyasına Sonra bu bin dosyasını SD karttan normal FatFS rutinlerine göre okusam hızlı bir şekilde nasıl olur?

RaMu

İlk aklıma takılan SPI modda SD kart okuma hızı
video oynatma için yeterli olacak mı sorusu oldu,
videodada yazmış, 00.25 de,
"Main bootleneck is limited
SD card transfer speed via SPI"
Yanlış hatırlamıyorsam
SPI modda kartına göre 8-24 MHz
arası bir Clock ile SD Kart haberleşebiliyor,
buda saniyede maksimum 1-3 MegaByte veri transferi demek.


"01_ Physical Layer Simplified Specification part1_410"
4.13.1.4 kısmında yazmış,
SPI modda Class 0 kart gibi düşünmek lazımmış,
grafiklere göre maksimum 2 Megabayt/saniye okuma hızı.








Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

baran123

.bin yapsanda olur.
Fakat karta direk video at çalıştır olmaz her seferinde dönüştüreceksin.
Kullanıcı yapmayacaksa sorun yok aslında daha basite indirgemiş olursun.
Hatta kendi formatını bile basitçe yaparsın.
https://en.wikipedi0.org/wiki/Video_file_format
Burada bazı formatları ses ve görüntü için hangi çözücüleri gerektirdiği gözüküyor.
Örneğin GIF için gerek yokmuş.


Birde dikkatimi çekti .yuv uzantısı var.
Raw format diyor.
Ama kendine özgü bir yapısı var.
https://en.wikipedi0.org/wiki/YUV#Y.27UV420p_.28and_Y.27V12_or_YV12.29
Şurada yuv'un RGB'ye dönüşümü gösteriliyor.
En altta dönüşümü yapan bir C++ kodu var

Ekleme : SDIO kullanacaksan hız daha iyi olur.

Mucit23

Amaç Video Görüntülemek. Bu yüzden yöntem farketmiyor.

Benim aklıma birde şu geldi. USB Hid ile bağlanacağım bilgisayardan görüntüleri almak. Bunun için C# da ufak bir yazılım yazmam gerekecek ama kolay. Video Çözünürlüğüm 320x240

STM32'nin USB Hid kütüphanesinde Tek seferde kaç byte veri gönderilebilir? Yani USB Hid Report Max size nedir? Çok eskilerden Tek bir paketin boyutu Max 64 Byte şeklinde kalmış ama bu veri güncel kütüphanelerde geçerlimi anlayamadım. Eğer USB hid hızım yeterli seviyede olursa bu şekilde bir yöntem denenebilir.

İkinci bir yöntem ise Videoyu Kare Kare BMP dosyalarına çevirip o şekilde sırayla resim basmak. Ama bu şekilde de her seferinde dosya aç, resim datalarını oku, dosyayı kapat gibi işlemler yapılacağında işler yavaşlayacak.

Gif en başından beri düşündüğüm format. Ama şunu anlamıyorum. Hangi format olursa olsun geçerli bu. Bunu anlarsam eğer video okuma rutinlerini kendim yazacağım.

Diyelimki FatFS ile .gif uzantılı bir dosya açtım. Bu dosyadan f_read ile bir bölüm okudum. Okuduğum verinin yapısını nasıl anlayacağım? Bu iş bir türlü aklıma yatmıyor. avi, mov veya mp4 bunun için kullanılabilir. ama dediğim gibi f_Read ile okuduğum zaman okuduğum verinin ne olduğunu nasıl anlayacağım? Bu konuyu anlasam biraz adım atabileceğim.