|
|
|
| здравствуйте.
Подскажите FFmpeg команду для наложения водяного знакана (изображения) на 3gp и mp4 видео. | |
|
|
|
|
|
|
|
для: adscom
(07.08.2010 в 15:37)
| | сначало выдирал из видео все кадры такой командой:
ffmpeg -i 1.3gp -f image2 src/i%06d.jpg
|
Потом выдрал аудио дорожку такой командой:
ffmpeg -i 1.3gp -acodec libamr_nb -ar 8000 -ac 1 -ab 12.2k src/audio.amr
|
Потом каждый кадр промаркеровал.
потом склеил из кадров такой командой:
ffmpeg -i src/audio.amr -f image2 -i src/i%06d.jpg -r 15 -acodec libamr_nb -ar 8000 -ac 1 -ab 12.2k output.3gp
|
Все нормально работает, но видео проигрывается быстрее, чем аудио.
Подскажите в чем может быть дело? | |
|
|
|
|
|
|
|
для: adscom
(07.08.2010 в 21:26)
| | Битрейты потоков не совпадают. | |
|
|
|
|
|
|
|
для: sim5
(08.08.2010 в 01:58)
| | А как сделать, чтобы совпадали? | |
|
|
|
|
|
|
|
для: adscom
(08.08.2010 в 03:59)
| | Если, к примеру, у вас есть видео общей длительностью 1 час, в котором частота кадров 25 в секунду, а звук 44 Кгц, то этот поток имеет определенный битрейт, как и каждый из его отдельных потоков (видео/аудио). Вы разделяете поток на два - видео и аудио, затем изменяете, например, частоту кадров до 24 в секунду, после чего опять объеденили эти потоки в один. Как вы думаете, синхронизация потоков сохранится или она будет утеряна?
Я не знаю ffmpeg, чего он и как делает, но нужно получить параметры каждого из потоков вашего видео, и разделять их именно с этими параметрами, в этом случае их длительность будет одинакова. И объеденять их нужно с такими же параметрами, и если ffmpeg не глюкает, значит все должно нормально получиться.
А вы к тому же, разбиваете видео на кадры, а значит и упаковать их в видео нужно именно с исходным битрейтом. | |
|
|
|
|
|
|
|
для: sim5
(08.08.2010 в 04:09)
| | Значит подожду знающих. | |
|
|
|
|
|
|
|
для: adscom
(08.08.2010 в 04:32)
| | Вы думаете вам предложат иное?
У видео есть разрешение, видео может быть упаковано каким либо компрессором, при этом указана степень компресси. В этом случае поток будет иметь определенный битрейт. Если вы упакуете теже самые кадры, но используя другой компрессор с той же степенью компрессии, то совсем не обязательно, что вы получите такой же битрейт потока, просто потому, что качество этот компрессор уже будет давать иное, а значит и битрейт будет иной. Тем более, если вы измените частоту кадров при упаковке, тогда уж точно надеяться не на что.
Ищите у библиотеки этой, как указать набору кадров скорость, компрессор, степень сжатия, при этом эти параметры должны быть вам известны - получены из исходного видео. В противном случае даже и не надейтесь на автоматическую синхронизацию видео и звука, такое возможно, если только угадаете и вам повезет.
Идеальным же вариантом было бы не распаковка видео, а изготовление видеодорожки состоящей из одного кадра с длительностью равной длительности исходного видео, которую и совместить с исходными видео. Но ffmpeg должен уметь не только накладывать видео на видео, но еще и понимать альфа канал, или хотя бы уметь вырезать цвет указанный как прозрачный. Вот если он может так работать, как это и делают видеоредакторы, тогда нужно делать именно так. Читайте об этой библиотеке, может что-то и можно сделать. | |
|
|
|
|
|
|
|
для: sim5
(08.08.2010 в 04:45)
| | У меня в начале скрипта идет чтение всех данных из исходного файла, и эти данные вставляются при упаковке видео.
По моему тут что то с кодеками. | |
|
|
|
|
|
|
|
для: adscom
(08.08.2010 в 04:51)
| | Данные, это одно, у данных (видео/аудио) есть еще и параметры, это другое. Вот с этими параметрами вы и должны упаковать свои кадры с логотипом, то есть новая видеодорожка должна быть такой же, как и была исходной - разрешение, частота кадров, применяемый кодек, степень компрессии.
Кодеки сами по себе не принимают решения, они могут иметь параметры по умолчанию, либо ffmpeg может что-то по умолчанию ляпнуть, если вы не укажите необходимого. | |
|
|
|
|
|
|
|
для: sim5
(08.08.2010 в 04:57)
| | На все ответ найдете =)
Скажите тогда в чем у меня ошибка? | |
|
|
|
|
|
|
|
для: adscom
(08.08.2010 в 05:51)
| | Я не знаю в чем ваша ошибка, так как не знаю ffmpeg и по его командам, которые вы тут представили, понятия не имею чего вы там не так делаете.
Но причина ошибки явна - это не соответствие скоростей потоков видео и аудио. Они ведь не сами по себе существуют, а имееют скорости и воспроизводятся в реальном режиме времни. А это значит, что звук "а" не ждет когда появится его кадр "К", а воспроизводится, при этом подразумевается, что видеопоток в это время воспроизводит кадр "К".
Вы указываете параметры видео, как разрешение, кодек, компрессию, для звука частоту семплирование, кодек, и все это отдаете компрессору. Компрессор при этом расчитает битрейт потока и запакует как подобает. У вас получается, что вы на исходную звуковую доржку (если вы только и ее параметры не изменили) накладываете видеопоток с параметрами как бог на душу положил, на глазок. Другого объяснения нет. | |
|
|
|
|
|
|
|
для: sim5
(08.08.2010 в 06:13)
| | При сравнение исходного файла и сконвертированного, все параметры одинаковы. | |
|
|
|
|
|
|
|
для: adscom
(08.08.2010 в 07:12)
| | Не может быть такого!
Откройте любой видеоредактор и поместите на его временную дорожку видео. Теперь выберите видео дорожку и укажите ей новую скорость - большую. Если у вас при этом на временной дорожке длительность видео дорожки останется такой же, и при этом слово "нифига" будет все равно синхронно с мимикой рта, тогда я вам поверю.
Если у вас видео воспроизводится быстрее чем звук по сравнению с оригинальным видео, то значит в вашем новом видео скорость видеопотока стала выше, его общая длительность стала меньше. | |
|
|
|
|
|
|
|
для: adscom
(08.08.2010 в 07:12)
| | Хотел дописать, да все некогда было:
У вас может быть другая проблема, которую вы воспринимаете как повышенную скорость видеопотока. Возможно скорость такая как и была, если вы извлекли кадров именно столько, сколько их было и в оригинале, и, если вы укажете ту же скорость кадров при компрессии, то скорость не изменится.
Но возможно в ориганале, в начале, есть бланк-кадр (черный кадр), который воспроизводится, например, одну секунду. Возможно, что такой кадр ffmpeg извлек ни как последовательность кадров (компрессоры упаковывают не все в кадре, а только их изменяемые фрагменты, сравнивая их с опорным кадром), а как один кадр (или меньшее чем в оригинале их число). В результате сведения дорожек, в этом случае, видеоряд у вас сместится относительно звукоряда. | |
|
|
|