Это видео недоступно.
Сожалеем об этом.
STM32 AVI video player with OSD menu. jpeg decoder optimization in assembler
HTML-код
- Опубликовано: 12 апр 2023
- STM32 AVI video player with OSD menu. Optimization of jpeg decoder in assembler.
The video shows animated films (under a Creative Commons license):
"Elephants Dream": © Сopyright 2006, Blender Foundation / www.orange.blender.org
"Big Buck Bunny": © Copyright 2008, Blender Foundation / www.bigbuckbunny.org
"Sintel": © Copyright 2010, Blender Foundation / www.sintel.org
The Blender Foundation is a non-profit organization dedicated to the development of an open source 3D modeling software package called Blender (www.blender.org).
AVI format requirements:
- mjpeg (motion jpeg) video stream, i.e. video frames must be encoded with the jpeg codec;
- mp3 audio stream i.e. sound must be encoded with mp3 codec.
To convert a video file to a format supported by the player, it is recommended to use the ffmpeg library. For example, the following command line converts an mp4 video to a player-supported avi format with a frame size of 320x240, a frame rate of 25 frames per second, and an encoding quality of 15:
ffmpeg -i video.mp4 -c:a mp3 -c:v mjpeg -s 320x240 -r 25 -q 15 video.avi
Where:
-i video.mp4 - an indication of the source file that you want to convert to the avi format supported by the player;
video.avi - output file with avi extension, where the conversion result will be saved;
-c:a mp3 - an indication that the "audio track" (audio stream) in the output file must be in the mp3 codec format;
-c:v mjpeg - an indication that the "video track" (video stream) in the output file must be in the mjpeg codec format (a set of pictures encoded with the jpeg codec, the so-called motion jpeg);
-s 320x240 - indication of the video frame size in the output avi file (width, height);
-r 25 - indication of the frequency of video frames in the output avi file (frames per second);
-q 15 indicates the encoding quality of the avi file (from 1 (best) to 31 (worst)). The sound quality can be set with the -b switch, which means bitrate (stream speed in bits / s). For example, a key such as -b:a 128k will set the audio stream to 128 kbps, which is considered the entry level for the mp3 codec when encoding music data (32-96 kbps is enough for speech encoding, and from 96 kbps or more - low quality music). A stream of 256 kbps is enough for high quality music when encoding mp3. 320 kbps is the limit for the mp3 codec.
When converting video, keep the aspect ratio of the source video frame in mind. For example, if the source video had a frame aspect ratio of 16:9, then when using a display with a width of 320 pixels, the height of the output frame should be 180 pixels. Those. the parameter s for the given example should be set to 320x180. If the aspect ratio of the source frame is 4:3, then when using a display with a width of 320 pixels, the height of the output frame should be 240 pixels. Those. the s parameter for this example should be set to 320x240. The q parameter determines the encoding quality and can take values from 1 to 31. As q increases, the quality decreases, and as q decreases, it increases. This setting naturally affects the performance of the software jpeg decoder.
List of components:
- development board stm32f401ccu6 alii.pub/6fdumy
- 3.2" touchscreen display ILI9341 spi alii.pub/6fdvcf
- pcm5102a audio DAC alii.pub/6fdurf
- micro SD card module alii.pub/6o72eb
- breadboard alii.pub/6fduuq
- wires for breadboard alii.pub/6fduwo
- encoder with button alii.pub/6o72l4
- ceramic capacitors 0.01-0.1 uF - 2 pcs.
Project link (github):
github.com/vad...
Contacts:
/ @vadrov
dzen.ru/vadrov
t.me/vadrov_ch...
stm32, jpeg stm32, avi stm32, mp3 stm32, video stm32, audio stm32, video stm32, audio stm32
#stm32 #jpeg #video
👉 *В видео демонстрируются анимационные фильмы (на правах лицензии Creative Commons):*
"Elephants Dream": (C) Сopyright 2006, Blender Foundation / www.orange.blender.org
"Big Buck Bunny": (C) Сopyright 2008, Blender Foundation / www.bigbuckbunny.org
"Sintel": (C) Copyright 2010, Blender Foundation / www.sintel.org
Blender Foundation - некоммерческая организация, занимающаяся разработкой программного пакета трёхмерного моделирования с открытым исходным кодом под названием Blender (www.blender.org).
👉 *Ссылка на проект (гитхаб):* github.com/vadrov/stm32f4_fast_optimized_avi_player_osd
👉 *Перечень компонентов:*
- плата разработки stm32f401ccu6 alii.pub/6fdumy
- дисплей на контроллерах ILI9341 или ST7789 с разрешением 320x240 или 240x240 с SPI интерфейсом (конфигурация дисплейного модуля определяется в файле display_config.h в папке Display) alii.pub/6fdvcf
- аудио-ЦАП pcm5102a alii.pub/6fdurf
- модуль микро SD-карты alii.pub/6o72eb
- макетная плата alii.pub/6fduuq
- провода для макетной платы alii.pub/6fduwo
- энкодер с кнопкой alii.pub/6o72l4
- конденсаторы керамические 0.01-0.1 мкФ - 2 шт.
👉 *Контакты:*
youtube.com/@VadRov
dzen.ru/vadrov
t.me/vadrov_channel
Вот до чего безответная любовь к мультикам может довести человека ) В неравной борьбе с компилятором победил Человек. Великий труд!
Асм жив! И будет жив всегда. Лайк и комментарий в поддержку канала.
повторил проект, просто огонь. хотелось бы продолжение, например перемотка видео, и пауза. попробуй сам добавить, но изучать и понять чужой код это сложно. А так супер, удачи. 👍
Отличный проект, спасибо что делитесь с нами проектами.
не знаю сколько людей взялись бы за такую работу, но вы молодец. такое не каждому под силу)
Приветствую. 🙂 Желание и труд всё перетрут. 🙂
Спасибо, что делитесь наработками. Пора делать уроки по ассемблеру
Мне делать уроки "компетенция" не позволяет, как написал в одном из комментариев некий блогер-"любитель котов", скрывающийся под "левыми" аккаунтами. Видео автора с "никакой компетенцией" нельзя называть уроками, так как это вредит зрителям и ничему не может их научить. Хотя, справедливости ради, ни одно свое видео уроком не называю и об уроках даже не заикаюсь. 🙂А видео по ассемблеру, конечно, будет.
@@VadRov бьюсь об заклад что у Достоевского не было никакого удостоверения и, тем не менее, он писатель! Возьмите любые две программы и вы поймете кто есть кто!😊😊😊 Проект 👍👍👍
С ассемблерными вставками и с макросом формирования смещения круто получилось 👍
Отличная работа! Снимаю шляпу. Для обработки энкодера можно иcпользовать аппаратные возможности таймеров в режиме ENCODER MODE. Там и защита от дребезга, и счетчик угла, и прерывания реже.
Можно, но тут ещё кнопка и комбинация событий. Хотя, всё реализуемо.
Ого го Топчик!
Предлогаю Че́ллендж - повтори устройство и выложи видос . Порадуй автора за его труды!!!!
Первый пошел
ruclips.net/video/yRFJdpKtyOI/видео.html
Только там без звука и на частоте ядра 84 МГц.
@@VadRov ruclips.net/video/JgTPknFu5o0/видео.html
ruclips.net/video/1u-iSjt7Wqs/видео.html
Почему я вас встретил именно сегодня? Спасибо вам!!!
Респект и уважуха за труды(особливо за коменты). Интересно, а сколько времени потратил на написание кода и отладку?
Значительная часть кода была написана и отлажена ранее. Здесь же всё просто собралось по сути в кучу. Пару вечеров заняла оптимизация дисплейного драйвера. На оптимизацию и отладку jpeg декодера ушло три-четыре вечера. Если всё делать с нуля, то неделька точно выйдет.
Очень интересный проект !
Спасибо !
Это невероятно круто
Блин, совсем случайно наткнулся на это видео и это прекрасно! спасибо!
Приветствую автора и всех собравшихся!
Восхищен проектом и трудом автора!
То что я только собирался сделать, после запуска мп3, вы уже реализовали)
Я запустил ваш проект на ф411. Но не смог перенести его на кейл. Возникла трудность с тем что звук идет в двараза быстрее.
Предлагаю автору забавную идею: реализовать двух ядерную систему на двух мк паралельно. Потому что в данный момен производительность недостаточная...
Творческих успехов! Автор - мега крут! Старая школа😊
Приветствую. Если звук передается с более высокой частотой, то проблема кроется в настройке интерфейса i2s (скорость передачи, см. различия в организации системы тактирования 401 и 411).
Смысла реализовывать "многоядерность" для решения задачи воспроизведения видео нет. Это так, проект - забава ради разминки мозга)) Недостающую производительность можно почерпнуть на другом, более мощном м/к, что будет дешевле и по бюджету, и, что самое главное, по временным затратам на программную реализацию. Тот же самый проект, например, я реализовал на "тайвано-китайском" м/к Artery at32f403a (плата отладки в районе 400 р. с доставкой), работающим на частоте 240 МГц. Там нет недостатка в производительности (переносил в целях освоения другого м/к). Если совсем станет трудно, то есть "монстры" подороже, в т.ч., у самой компании ST. Как вариант, H7 серия. Но, как уже кому-то писал в комментарии, если бы стояла именно задача создания недорогого и функционального медиаплеера, то я бы, например, использовал какой-нибудь из доступных и дешевых allwinner-ов. А проекты, подобные этому, просто хорошая зарядка для "любителя покодить".
@@VadRov спасибо за ответ) если есть возможность, то пересоберите этот проект под кейл) с наилучшими пожеланиями!
Супер проект..
Круто канеш, жаль у меня меня руки из жопы растут. 😁Вроде собрать не шибко сложно.
А аудиокниги на нем можно слушать? И сколько он потребляет?
В ближайшем видео по многочисленным просьбам зрителей (а также исходя из возникающих вопросов) планируется расширение функционала, т.е. наряду с видеоплеером будет встроен и аудиоплеер (mp3). Что касается потребления, то оно невелико, особенно, если выключить дисплей (перевести его в режим "сна"). Для микроконтроллера - это около 140 μA/MHz. Если только воспроизводить звук (mp3), то частоты ядра в 40 МГц должно хватить для снижения потребления (порядка 8 мА на микроконтроллер с требуемой периферией). Но для нестационарного использования (вне дома) придется добавить затраты энергии на усилитель для наушников либо внешних динамиков (например, усилитель на 3 Вт). Кроме того, следует принять во внимание потребление micro sd карты. Оно может быть и 10, и 50, и даже 100 мА в зависимости от марки/изготовителя карты, ее объема, применяемых технологий и т.п. ЦАП PCM5102 потребляет около 30 мА (в зависимости от частоты Fs).
@@VadRov Ого. Спасибо за быстрый ответ. Внял.
По факту для аудиокниг портативных плееров, вменяемых по цене и с файл-менеджером нет. Была Дигма, но и та гуманным ценником из-за популярности не отличалась. Короче ничего проще и дешевле мобильника нет🤷♂, а это и не мобильно по размерам и не автономно по вемени.
АудиоКнигоФилам тачскрин не нужен. Нужны аудиокниги в разных папках и автономность. Про закладки никто даже не заикается😁
В общем было бы круто.👍
Про micro sd карты не знал, 10 и 100 огромная разница.
Расширение функционала - это очень хорошая новость. Есть просьба к автору: добавить на ряду с мп3 ещё и декодер flac.❤❤❤
Молодец, сколько памяти микроконтроллера заняла ?
100 кБ вместе с текстурами и шрифтом.
куда вы пропали коллега? ждем новых роликов
Времени катастрофически не хватает. Все свободное время уходит на новую стройку. Верчусь как белка в колесе последние несколько месяцев.
@@VadRov понял. тогда удачи, а как будет время ждем контент
отлично!!! теперь вопрос: под stm746Disco можно доработать?
Весь код, относящийся к "ядру" плеера, в т.ч., оптимизация на ассемблере на ядре Cortex-m7, конечно, работать будет. А вот для поддержки периферии придется корректировать код: дисплей на stm746Disco подключен по fsmc, sd-карта по sdio, ЦАП, наверное, тоже свой есть. Если это вопрос общий, т.е.: "Можно сделать или нет?", то ответ: "Можно". Если вопрос ко мне: "Могу сделать я или нет?", то ответ: "Смог бы, но у меня нет такой именно платы разработки".
А почему esp32 неиспользуете там частота 240мгц и 2 ядра ещё и флешка в топовой комплектаций 16 мегов + доп psram + ацп 8 или 16 бит незнаю быстрее будет это про esp wrover 32. Какраз для плеера сгодится
Наверное сможет вывести тот же мультик на дисплей 640на480
Не использую, потому что тут дело не в плеере, а просто в возможностях использования ресурсов недорогого МК от stm. То есть плеер в данном случае - это способ демонстрация того, как можно писать программы в условиях ограниченности ресурсов. Если бы передо мной стояла задача именно создания мультимедиа плеера, то я бы вообще использовал какой-нибудь Allwinner, у которого все для этого есть: интерфейсы, ускорители, кодеки и т.п. esp32 для подобных задач будет не шибко быстрее примененного микроконтроллера от stm, несмотря на наличие дополнительных "плюшек". То есть результат был бы фактически аналогичным.
Доброго здравия! Решил на досуге посмотреть Вашу реализацию энкодера на прерываниях. Никак не соображу 167 строку ...keys &= ENCODER_C; /* Получаем состояние выхода С, выделив его из совокупности выходов. */ Так как переменная keys изначально равна 0, то после логического И мы также имеем 0. Не поясните? Заранее спасибо.
Приветствую! А в самом начале видите?
/* Опрашиваем выходы энкодера (они же входы МК) и формируем в переменной keys значение,
соответствующее текущему состоянию выходов энкодера. */
if (!(enc->a_port->IDR & enc->a_pin)) keys = ENCODER_A; /* Активен выход A (прижат к "земле"): установим бит ENCODER_A. */
if (!(enc->b_port->IDR & enc->b_pin)) keys |= ENCODER_B; /* Активен выход B (прижат к "земле"): установим бит ENCODER_B. */
if (!(enc->c_port->IDR & enc->c_pin)) keys |= ENCODER_C; /* Активен выход C (прижат к "земле"): установим бит ENCODER_C. */
Уже не 0. 🙂
@@VadRov Да, конечно, Вы правы. У меня при прохождении этих строк в отладке значение keys не изменяется, что странно, тк прерывания срабатывают. Буду разбираться, спасибо.
@@VadRov Разобрался) выражение (enc->c_port->IDR & enc->c_pin) работает в F4 серии. В серии F1 чтения пина не происходит, соответственно переменная keys всегда равна 0.
@@kokotmkokot4926 , наверное, из-за этого "These bits are read only and can be accessed in Word mode only. They contain the input value of the corresponding I/O port." Т.е. доступ возможен только при чтении полного слова. Т.е. в структуре пинам объявить uint32_t вместо uint16_t
Я забыл про это. Это не критично для F4 серии (хотя есть уведомление), в G0 серии про это, например, вообще не указано. А для F1 критично. Обновил на гитхабе.
Have you made code video player with fsmc?
In this project the screen is connected via SPI. With FSMC you can do it by analogy. The only difference will be in the display driver. For example, on stm32f407vet6 this is easy to do. I developed the CMSIS driver for FSMC. I made some demos. Namely, I did not translate this project onto the screen from FSMC. Maybe someday, in my spare time, I’ll do it.
@@VadRov Thank you
@VadRov, а как вывести jpeg картинку с sd карты?
Ваши картинки получилось вывести, которые во флеш мк
Для этого следует использовать функцию LCD_Load_JPG_chan(lcd, x, y, w, h, image_stream, location),
где параметр location должен быть равен PICTURE_IN_FILE, а image_stream является указателем на данные типа iFile_jpg (см. jpeg_chan.h в папке JPEG):
typedef struct {
void *file; //указатель на обработчик файла
volatile uint32_t size; //размер файла
} iFile_jpg;
Т.е. Вы должны объявить обработчик файла, открыть файл и создать переменную типа iFile_jpg. Например:
FIL file;
iFile_jpg jpeg_file;
f_open(&file, "example.jpg", FA_READ);
jpeg_file.file = &file;
jpeg_file.size = f_size(&file);
LCD_Load_JPG_chan(lcd, 0,0, 320, 240, &jpeg_file, PICTURE_IN_FILE);
Разумеется файл не должен быть прогрессивным jpeg. Кроме того, может не хватить памяти. В этом случае увеличиваем параметр JPEG_CHAN_WORK_BUFFER_SIZE (см. jpeg_chan.h в папке JPEG).
@@VadRov, спасибо, получилось.
сделал так:
f_lseek(&MyFile,ind);
f_read(&MyFile, buf,512,&byteread);
memcpy(jpg_buf+ind,buf,512) ;
ind+=512
после всего копирования
const Picture_jpg image = {sizeof(jpg_buf), jpg_buf};
(void)LCD_Load_JPG_chan(lcd, (Picture_jpg*) &image);
Но если так делать, то буфер jpg_buf[15000] надо делать большим по умолчанию, а когда пробовал кидать частями, выводился маленький фрагмент и потом ошибка
Нужно ли обязательно копировать весь файл целиком перед отправкой в функцию LCD_Load_JPG_chan?
Пользовался проэктом файлменеджера, т.к. там код написан профессионально, но легче чем в этом проэкте, этот проэкт пока для меня недосягаем.
@@staszzz5067 , насколько понял, Вы пытаетесь "засунуть " файл jpeg картинки в буфер, расположенный в оперативной памяти, а потом выводить из него, т.е. сделать по аналогии с тем, как в данном проекте осуществляется вывод jpeg файлов из флэш. Выше я схему дал, как выводить картинку непосредственно с sd карты, без необходимости копирования файла в буфер целиком. Функция вывода картинки написана так, что ей можно передавать как файловый поток из флэш (PICTURE_IN_MEMORY), так и файловый поток c sd (PICTURE_IN_FILE). Вариант определяется параметром location. И уже задача подгрузки картинки частями во временный буфер возлагается на саму функцию вывода. Т.е. это не Ваша головная боль. Если будет ошибка, то ее код вернет функция.
Upd.: В общем, я напишу доп. функцию просмотра jpeg картинок и обновлю проект на гитхабе.
@@VadRov , большое спасибо!
Здравствуйте. Проект шикарный !!!! но Чёт оно у меня не работает )))) Подцепил ST7789 , библиотеку подключил, инициализацию поменял на 7789 , а на экране темнота. Видать что то где то ещё нужно править ? Другие ваши проекты с этим экраном работают. CubeIde последней версии, может с ней что не так. Подскажите куда копать ?
Давно кстати ваших видосов поучительных не выходило, не охота время на нас, дурачков , тратить ? ))
Приветствую. На видосы времени не хватает, потому что я опять влез в стройку, на которую, собственно, трачу всё свободное время. Дисплей с каким разрешением?
@@VadRov 240x240 стандартный, как у вас
@@VasyaPupkinus , изначально проект под 320 на 240. Но если дисплей черный, значит, работает неправильно. Для начала в файле display-config.h отредактируйте строку #define LCD_USE_ASSEMBLER 0
@@VadRov не помогло
@@VasyaPupkinus ,конечно, не поможет. Вам бы отладку дисплея для начала провести, отключив все остальное. Проверить схему подключения дисплея, наличие контактов, почитать в github.com/vadrov/stm32-display-spi-dma пункт "Решение проблем с подключением дисплея".
Попытался повторить. Прошил готовый hex-файл из проекта на гитхабе. Дисплей заработал, выдал заставку и сообщение "Error FileManager!" на розовом фоне. При попытке повернуть энкодер это сообщние начинает быстро мерцать. Схему проверил. Видеофайл на карточку залил. Нифига! Не работает! Кто-нибудь, кроме автора, пытался запустить этот проект?
Как минимум о двух повторах данного проекта есть видео на RUclips.
Похоже, что в Вашем случае есть ошибка чтения sd карты. Проверьте схему её подключения, а затем попробуйте снизить скорость spi, к которому подключена карта.
Можно попробовать подать питание на microsd до включения stm, либо в коде перед монтированием диска добавить задержку. И после фейла карточку нужно резетнуть (думаю, она могла "подвиснуть"). ну это так, мысли в слух :)
Сергей, попробуйте обновить проект с гитхаба. Я выловил месяца полтора назад (и забыл об этом) один баг в драйвере sd при переносе проекта на микроконтроллеры семейства artery (в коде драйвера не опрашивался флаг busy spi).
@@VadRov Обновил hex-файл с гитхаба. Ничего не изменилось. Кстати, заметил, что у меня на дисплее цвета заставки инверсные - синие элементы на розовом фоне. Дисплей (ILI9341) в других проектах ведет себя адекватно (например, в ёRadio). Похоже, что инициализация не полная. Карточку и вставлял, и вынимал - реакции нет. Питание карточки от своего отдельного стаба 3,3V. Жаль, весь проект копать времени нет, я к IAR привык :).
@@marsikovsergey , а плата точно на контроллере stm32f401ccu6? Если бы инициализация была неполная, то была бы полная повторяемость багов, как у Вас, у всех, (в т.ч., и у меня) кто попытался повторить проект на тех же комплектующих, что в описании к видео. Если изображение инверсное, то есть сомнения, что дисплей на котроллере ili9341. Больше похоже, что он на контроллере st7789 (для него в коде инициализации отключают инверсию). ёRadio, скорее всего, читает при инициализации строку из rom дисплея, по которой определяет, какой драйвер будет управлять дисплеем.
Карточка может не заработать, если не поддерживает скорость spi, которая указана в коде проекта. В общем, с hex проблему не решить.
Шикарно! Не понятно почему энкодер таймером не обрабатывать, еще б больше разгрузился проц. Но результат впечатляет!
Так он, по сути, и не загружается от энкодера.. Энкодер с кнопкой на внешних прерываниях. Т.е. он нагружает ядро (и то незначительно) только в тот момент, когда мы вращаем энкодер или нажимаем его кнопку. При этом управление можно настроить более гибко, чем в случае с таймером.
@@VadRov более гибко? Да тоже самое вышлоб и отрабатывал одно прерывание от таймера... Ну в целом кто как привык...
@@WWolf_13 , я сделал, как увидел для этого проекта, а не как привык. Значит, так надо было 🙂
Ну, и про одно прерывание от таймера Вы, мягко говоря, лукавите. Про кнопку забыли? 🙂На нее тоже прерывание по спаду/нарастанию.
@@VadRov не лукавлю... Кнопка за скобкой, её обработка отдельно... А два прерывания на лево/право или одно от таймера с обработкой дребезга по умолчанию...
@@WWolf_13 , т.е. Вы предлагаете использовать таймер не в режиме encoder mode, как я изначально подумал?
Can you change the code to fsmc tft?
Hello. What microcontroller do you want to use?
Stm32f407
Stm32f407
Ili9341 16bit
@@ismailbasic11 , this board? aliexpress.ru/item/1005001579853052.html
Yes
А я тут случайно... И думал что-то пойму))))
Ващще ничего не понял))) не моё))
Бывает. 🙂