Как сжимать видео?
Дайте пожалуйста хорошую проверенную ссылку, тема наверное большая, чтобы прям здесь объяснять.
Но если не обломно, то тут распишите.
Цитата:
Originally posted by Sanya DLR
Интересуюсь принципами сжатия видео. Или существующими алгоритмами. Хочу сам сжимать (пока из кадров) и сам просматривать.
Дайте пожалуйста хорошую проверенную ссылку, тема наверное большая, чтобы прям здесь объяснять.
Но если не обломно, то тут распишите.
Интересуюсь принципами сжатия видео. Или существующими алгоритмами. Хочу сам сжимать (пока из кадров) и сам просматривать.
Дайте пожалуйста хорошую проверенную ссылку, тема наверное большая, чтобы прям здесь объяснять.
Но если не обломно, то тут распишите.
Хочешь заняться работой лабораторий?
Для начала попробуй сжать простую картинку.
Это раз. Потом попробуй создать архиватор. Это два.
И уж потом приступай к видео.
А самый простой способ, это использовать уже готовую ДЛЛ.
(один я даже знаю какой) - если хочешь взяться
я её выложу - исправишь баги (и себе и мне доброе
дело). - я её писал для сжатия текстур, но легко
покатит и для другого - а смысл я объясню.
Простую картинку сжимать пробовал, как и архиватор делал... А теперь приступил к видео :)
Но не смог получить достаточного сжатия кустарными алгоритмами ни в одном из этих начинаний :( а вопросы скорости еще даже не пытался решать
На лабораторию я не тяну, но КАКИЕ-ТО же алгоритмы (принципы) распространяются свободно, чего я не знаю! (т.н. общеизвестные...) Все равно мне без чужого опыта не обойтись.
ДЛЛ не катит (это принципиально - иная среда выполнения) - тогда лучше уж виндовс медиа плеер, вместо как-нибудь...
bave:
ок. Давай функцию, посмотрим.
Однако... видео сжатие - это сжатие в десятки и сотни раз с потерями... несколько другие принципы, как я понимаю
unsigned long BAVEPACKER:: compress(
void *pBuffer, //Указатель на область памяти куда
//считан файл (указатель на перый //байт
unsigned long cnt, //число байт (исх. размер)
UINT uCmp) //сжимать/не сжимать
{
unsigned int ms;
if(uCmp == 0) return cnt;
__asm
{
mov ecx,cnt
mov ebx,pBuffer
mov edi,ebx
xor esi,esi
label:
xor eax,eax
mov al,1
mov ah,[ebx]
add esi,2
equel:
mov dl,[ebx+1]
cmp ah,dl
jne n_equel
add ebx,1
add al,1
mov ah,[ebx]
dec ecx
jz exit_proc
jmp equel
n_equel:
dec ecx
add ebx,1
mov BYTE ptr [edi],al
mov BYTE ptr [edi+1],ah
add edi,1
jnz label
exit_proc:
mov ms,esi
}
return ms;
}
--------------------------------------
Вообщем в цикле пробегаем по весму файлу (вернее
сказать по области памяти куда он скопирован)
В аh помещаем первый байт, в dl - следующий и
сравниваем их если их содержимое одинаково al увеливаю на 1, перемешаюсь на следуюший байт - т.е. сравниваю 2-ой и 3-ий если одинаковые тогда снова al+1 и т. д. - короче в al копится число повторений (число одинаковых байт) - потом
записываем в первый байт число повторений, а во
второй само значение байта, в регистре esi -
накапливается новый размер файла..., а pBuffer
уже указывает на сжатые данные...
После выполнения функции можно сделать так:
pPtr = (byte *)malloc(newSize);
memset(pPtr, 0, newSize);
memcpy(pPtr, pBuffer, newSize);
free(pBuffer);
-------------------------------
После этого pPtr - будет указывать на область
памяти содержашей сжатые данные - их можно записать в файл.
------------------------------------------
Недостаток: Я забыл предусмотреть переполнение -
вдруг одинаковое значение байта будет повторяться
больше чем 256 раз (например картинка RGB без альфа канала вся белого цвета) - тогда в al окажется лажа
Цитата:
Originally posted by Sanya DLR
Интересуюсь принципами сжатия видео. Или существующими алгоритмами. Хочу сам сжимать (пока из кадров) и сам просматривать.
Дайте пожалуйста хорошую проверенную ссылку, тема наверное большая, чтобы прям здесь объяснять.
Но если не обломно, то тут распишите.
Интересуюсь принципами сжатия видео. Или существующими алгоритмами. Хочу сам сжимать (пока из кадров) и сам просматривать.
Дайте пожалуйста хорошую проверенную ссылку, тема наверное большая, чтобы прям здесь объяснять.
Но если не обломно, то тут распишите.
Надеюсь это поможет:
void *pBuffer, //Указатель на область памяти куда
//считан файл (указатель на перый //байт
unsigned long cnt, //число байт (исх. размер)
UINT uCmp) //сжимать/не сжимать
{
unsigned int ms;
if(uCmp == 0) return cnt;
__asm
{
mov ecx,cnt
mov ebx,pBuffer
mov edi,ebx
xor esi,esi
label:
xor eax,eax
mov al,1
mov ah,[ebx]
add esi,2
equel:
cmp cx,1 ;последний(или 0 ? )
jz n_equel ; не с чем сравнивать
mov dl,[ebx+1]
cmp ah,dl
jne n_equel
cmp al,255
jz n_equel ; записать и заново
add ebx,1
add al,1
mov ah,[ebx]
dec ecx
jz exit_proc
jmp equel
n_equel:
add ebx,1
mov BYTE ptr [edi],al
mov BYTE ptr [edi+1],ah
add edi,1
dec ecx ; так оно вернее
jnz label
exit_proc:
mov ms,esi
}
return ms;
}
+особая обработка последнего символа
+длинная цепочка - это несколько цепочек
+последняя проверка длины - с багом
А вообще-то, здесь еще нет пропуска цепочек неповторяющихся символов. Я такое делал - сжатие невелико. А если цветов (или градаций) много - вообще почти нет повторов.
------------------------------------------
Но если сжимать видео - то на каждом кадре по чуть чуть и наберётся...
Здесь форматы: Fli,Anm,Avi и GIF (до полного щастья :)
Если будет еще инфа по видео - давайте.
Если кто-то сам занимался видеоплеером, то поделитесь первыми... хмм... торетическими наработками - это как правило маленький по результату первый шаг, но оччень долгий когда сам разбираешся.
То есть, хотя бы про грабли и велосипеды расскажите.