AVI to CANON converter.

Hi All! :)

Решил не извращаться по поводу дизайна сайта и т.д., а просто выложить файлики с минимальными разъяснениями :)

В общем, эта страничка - для счастливых обладателей Canon-ов, по крайней мере A-серии (Canon A60, Canon A70, Canon A75, Canon A300/A310 и т.д.). Сам я (пока что) являюсь обладателем A60 (в своей нише - почти что рулез немеряный :) ), и сестричке недавно A310 подарил (немножко, конечно, недотерпел до A400 с зумом, ну да ладно, её вроде бы устраивает). Ну да речь вроде не про сами фотики пойдёт. Начнём, пожалуй. Да, кому неинтересно читать технические нюансы и мои излияния - прыгайте сюда.

 

Предыстория.

Если для скачивания фоток вы пользуетесь кардридером, то, вероятно, вы пытались не только скачать, но и закачать фотки или видео назад на флэшку. Что вполне логично, у вас ничего не получилось :) Точнее, могло получиться, но только в том случае, если файлики (JPG и AVI с THM) были тоже созданы на Кэноне. А вот залить произвольные фотки или, тем более, видео, вроде как через картридер нельзя...

Что касается фоток, то тут всё решается очень просто - использованием стандартного Кэноновского софта (ZoomBrowserEx) - там вполне есть возможность заливки фоток в фотик через PTP. Если углубиться в технические детали, то, в общем-то, необходимо преобразовать JPEG в Standard Baseline JPEG с разрешением 640х480/1024х768/1600х1200/etc., добавить туда Exif-инфу о фотике, установках, владельце и т.д., и вуаля! - можно заливать в фотик. Ну поскольку уже есть софт, который это делает, то никакого желания с этим возиться, по крайней мере, у меня не возникало.

Зато возникло желание залить на фотик какой-нибудь произвольный видеоклип. То, что он по длине не должен превышать 3 минут (дурацкое какое-то ограничение у этих Кэнонов..), это, конечно, плохо, но терпимо. А вот то, что даже имея Morgan Multimedia MJPEG codec, VirtualDub и относительно некривые руки :), я сходу не смог залить клип в фотик (точнее, залить-то я его залил, но, ессно, фотик наотрез отказался его проигрывать). Тут-то и возникло желание разобраться, в чём дело, и подумать, как всё-таки можно заставить мой фотик понимать мои AVI-шки.

 

Инструменты.

Во-первых, я ещё до покупки фотика знал, что он сжимает видео в MJPEG. Поэтому заранее запасся MJPG-кодеком Morgan Multimedia M-JPEG codec v 3.0.0.9. Если кратко - то это вроде как почти обычный JPEG, без всяких там промежуточных (т.е. не ключевых) кадров, правда, сохранив Hiew-ом данные из одного кадра (который, как и обычный JPEG, начинается с двух байт FF D8 и заканчивается FF D9) в JPG-файл, просмотреть каким-нибудь ACDSee или другими просмотрщиками, не смог. Все попытки найти описание MJPG-кодека совершенно не увенчались успехом. Более того, я ещё нутром чувствовал, что надо ж ещё в самой AVI-шке кучку полей добавить/изменить... но вот что добавлять и что изменять - не представлял. Поэтому, в общем-то, я как-то это дело и забросил.

Дело сдвинулось с мёртвой точки в первый раз, когда листая MSDN, я наткнулся на примерно такую ссылочку. (Ссылочка на MSDN July 2000 (по-моему), установленный на мой комп). Если у кого MSDN-а нету, то эта страничка (и ещё эта) описывает расположение данных в AVI-файле. Разобравшись в том, что там Canon пишет в AVI-файл, я, прежде чем хвататься и писать прогу, подправляющую формат AVI-шки в перевариваемый Canon-ом вид, сделал хитрее - взял один кадрик из клипа, сжатого Моргановским кодеком, и подставил в Кэноновскую авишку. И вот тут меня ждал облом. Кэнон НАПРОЧЬ отказался воспринимать этот кадр - в покадровом режиме он его просто не воспроизводил, а при обычном проигрывании он замирал на предыдущем кадре... Я понял, что не судьба, видимо, запихнуть в кэнон авишку, и положил проект в архив.

Дело сдвинулось с мёртвой точки второй раз, когда я случайно наткнулся на описаловку JPEG-формата (Cristi Cuturicu - CRYX's note about the JPEG decoding algorithm). Расковыряв тем же Hiew-ом обычный JPEG и MJPG-кадры, сделанные Моргановским кодеком и Кэноном, я обнаружил, что, во-первых, MJPG - это всё-таки тот же обычный JPEG, только вот в потоке встречается какой-то странный маркер FF E2 - вроде как RST2, который не используется. Это в кэноновском. А в моргановском его нету. А ещё и в том, и в другом отсутствует DHT-маркер (Define Huffman Table) с кодом FF C4. А данные, идущие за присутствующим FF E2 ну очень сильно смахивают на эту самую Huffman Table. Берём, меняем на FF C4, и опа! - обычный ACDSee чудесным образом начинает показывать MJPG-кадры!

Но глубокое ковыряние в кадре меня чуть не сгубило. Я обнаружил, что после маркера DQT (Define Quantization Table) в моргановском и кэноновском кадре идут разные данные!.. И ещё, в моргановском же напрочь вроде как отсутствовала Хаффмановская таблица... Ну, со вторым понятно - я просто взял и вставил её из кэноновского кадра, благо она во всех кадрах одинаковая была, а вот с первым... я очень сильно боялся, что кэнон меня пошлёт с таблицей квантизации от моргановского кодека куда подальше.. поэтому сначала тихонечко заменил моргановскую QT кэноновской (что привело к тому, что кадр оказался на 50% светлее) (а ещё привело к небольшому радостному воплю с моей стороны - я, наконец-таки, увидел, хоть и слишком светлый, но СВОЙ кадр в кэноновской авишке на фотике). А потом рискнул оставить в кадре моргановскую QT... что привело уже к большому воплю :) - кэнон спокойной прожевал и этот кадр! Ну, в смысле, правильно показал :)

А дальше всё уже было делом техники и (небольших) танцев с бубном. За полночи была дописана прога для преобразования из "VirtualDub-овской" AVI-шки в "кэноновскую", ещё за маленький кусочек ночи - процедурка для преобразования самих кадров, и за кусочек следующего дня - небольшие изменения в программке, чтобы она всё-таки работала :) (Кэноновцев прибить надо - ну кто ж догадается в свойствах кодека, прописываемых в AVI-шке, прописывать количество кадров и т.д. - то есть ту инфу, которая уже есть в заголовке!..) (ну да ладно, это я отвлёкся).

 

Результат.

Вот эта прога :)

 

Инструкция по эксплуатации.

1. Запускаете VirtualDub. Я пользовался версией 1.5.13, пойдёт, наверное, и 1.6.3, но я не уверен. Теоретически я хотел сделать прогу, конвертящую любые MJPG-овские авишки, но практически я понял, что ленивый очень :)

2. Открываете AVI-шку. Любую.

3. Добавляете фильтр преобразования размеров (Video->Filters->Add->resize). Указываете размер 320х240. При желании можно сделать "широкоэкранное" видео, но, главное, чтобы получившийся размер был именно 320х240. Или 160х120. Или 640х480, но с последним я не экспериментировал (уж слишком огромными файлы получаются). Вот пример, как это делается.

4. В Video->Frame Rate устанавливаете Convert to FPS: 15. Остальное не трогаете. Пример.

5. В Video->Compression устанавливаете кодек Morgan Multimedia M-JPEG V3 codec, причём смотрите, чтобы FOURCC code у него был 'mjpg'.

6. В свойствах кодека обязательно проверьте, чтобы в compression стояло 4:2:2, а не 4:1:1.

7. Выбираете пункт Audio->Full processing mode.

8. Идёте в Audio->Conversion. Ставите в Sampling rate режим Custom: 11024 (не 11025, а именно 11024!), в precision - 8-bit, в channels - Mono.

9. Настройки закончились, остаётся выбрать File->Save as AVI... и сохранить преобразованный файлик.

10. Теперь наступает черед работы моей программки :) Программка консольная, поэтому лучше всего её запускать из-под FAR-а какого-нибудь. прога требует 2 параметра - имя исходной авишки и той, которая будет заливаться в фотик. Например:

avi2canon.exe test.avi MVI_5809.AVI

11. Оно там чего-то кучу всего навыводит (главное, чтобы Warning-ов и Error-ов особо не было), и создаст файлик MVI_5809.AVI (в данном случае).

12. Теперь этот файлик можно со спокойной душой заливать в каталог DCIM\CANON158 (например), и вместе с ним обязательно нужно положить файлик MVI_5809.THM с thumbnail-ом. Поскольку я уже упоминал, что человек я ленивый, и этот файлик мне создавать быть лень, можно сделать просто - взять любой THM-файлик от другой кэноновской авишки (лучше, если разрешение будет совпадать, наверное), и скопировать его в нужный. Кэнон прожуёт и даже картинку всё равно правильную покажет :)

13. Запихнуть флэшку в фотик и смотреть клип :)

 

Нюансы.

1. AVI-шка обрезается до 3 минут (180 секунд), и количество кадров округляется в меньшую сторону до ближайшей секунды. Первое обусловлено свойствами фотика, второе - моей ленью заморачиваться с частями секунды :)

2. Подозреваю, что желательно класть файлы в соответствующие им каталоги. Т.е. файлы MVI_58??.* желательно класть в каталог DCIM\CANON158, файлы MVI_16??.* - в каталог DCIM\CANON116 и т.д. Про THM-ки не забывайте!..

3. Постараюсь выложить сюда и VirtualDub, и моргановский кодек. Для полноты картины.

4. Что-то ещё было, не сейчас не припомню :)

 

Дополнения.

По многочисленным просьбам :) выкладываю кусочек из MSDN-а, где расписан классический формат AVI. Это для тех, у кого MSDN-а нету и кому лень это искать в дебрях msdn.microsoft.com :)

Вот этот кусочек (просматривается, видимо, только Internet Explorer-ом. Возиться с конвертированием лень :)

 

Ругательства.

Все пожелания, гнилые помидоры и т.д. можете кидать в мой email (о_k -coбaчкa- рisеm.nеt) или в фидошку на 2:450/160.57. Всё прочитаю и постараюсь учесть/ответить. Ежели кому понадобятся исходники - с удовольствием вышлю :) Смотреть там, правда, не на что особо, разве что комментарии иногда полезные :)

 

С уважением, Олег Котов a.k.a ElfSoft.