LINUX.ORG.RU

Кодирование видео 2


0

2

Серия вопросов:

1) Как я понимаю наиболее оптимальным сейчас является кодирование h264+ac3 (звук)+mp4(контейнер).

А какие из существующих кодеков, поддерживаемых ffmpeg наиболее свободные? ogg — звук, mkv — контейнер, а видео?

2) Стоит ли заморачиваться с двух[много]проходным кодированием? В чём и каков выигрыш?

3) Надо будет сшить несколько файлов + добавить статическую заставку. Это лучше делать единым процессом или можно сначала ужать каждый из кусков, а затем слить в единый файл?

Как сделать последнее я примерно понимаю. Как сказать ffmpeg сделать первое?

P.S. Начало топика было тут

★★★★★

Последнее исправление: Evgueni (всего исправлений: 1)

Как я понимаю наиболее оптимальным сейчас является кодирование h264+ac3 (звук)+mp4(контейнер).

Вообще-то зависит от того, где будет воспроизводиться, т.е. что поддерживает воспроизводящее устройство или софт.

Звук imho лучше не ac3, а aac/aac+. В ffmpeg этот кодек в разных сборках разный, где-то aac, где-то libvo_aacenc, где-то может другое.

А какие из существующих кодеков, поддерживаемых ffmpeg наиболее свободные? ogg — звук, mkv — контейнер, а видео?

Если хочется свободными кодеками, то лучшее это vp8+vorbis в контейнере webm. В ffmpeg эти кодеки называются libvpx и libvorbis соответственно.

Как сказать ffmpeg сделать первое?

Кодек h.264 в ffmpeg называется libx264. Кодировать командой вида ffmpeg -i video-in.mp4 -c:v libx264 -c:a ac3 -b:v 2000k -b:a 64k video-out.mkv
Я часто ещё метаинформацию прописываю, например -metadata title="Название ролика" -metadata comment="Комментарий"

Стоит ли заморачиваться с двух[много]проходным кодированием? В чём и каков выигрыш?

Выигрыш незначительный, я его вовсе не вижу. IMHO в большинстве случаев не стоит.

(Firestarter)

anonymous
()
Ответ на: комментарий от anonymous

Firestarter

аттеншн-шлюха в терминальной стадии

anonymous
()

откуда ты 5 звезд взял?
такое чувство, что аккаунт сперли, и сейчас им пользуется левый человек, которого в гугле забанили

ogg - это контейнер и название проекта свободных кодеков

ogg vorbis - это аудио КОДЕК
ogg theora - это видео КОДЕК

reprimand ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо за указание на метаданные.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Звук imho лучше не ac3, а aac/aac+. В ffmpeg этот кодек в разных сборках разный, где-то aac, где-то libvo_aacenc, где-то может другое.

В ffmpeg пять кодеков AAC: свой собственный, из libvo-aacenc, из libfaac, из libfdk-aac и из libaacplus (мутная лицензия). Можно ещё проприетарный Nero AAC Encoder поставить.

ksa242
()
Ответ на: комментарий от ksa242

В ffmpeg пять кодеков AAC: свой собственный, из libvo-aacenc, из libfaac, из libfdk-aac и из libaacplus (мутная лицензия). Можно ещё проприетарный Nero AAC Encoder поставить.

Но в дефолтной сборке в репах обычного дистра обычно что-то одно.

anonymous
()
Ответ на: комментарий от anonymous

А какие из существующих кодеков, поддерживаемых ffmpeg наиболее свободные? ogg — звук, mkv — контейнер, а видео?

Очень важно понимать, что когда вам гугл ссыт в уши про то, что H264 несвободен, а vp8 свободен, то это именно вам ссут в уши.

Никакой такой «свободы» у кодеков не существует.

У H264 есть открытая, бесплатная спецификация, которая делалась большим сообществом.

У vp8 есть какой-то отблевок текста, который делался впопыхах накануне релиза.

Примерно 99% людей вообще никакие вопросы патентной чистоты не касаются, потому что их никогда не будет трогать никакой MPEG-LA.

А вот то, что vp8 нигде вообще не проигрывается — это касается большого количества людей.

mkv — то же самое. Все задачи полностью решаются в mp4, но анимешникам приятнее видеть mkv.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

mkv — то же самое. Все задачи полностью решаются в mp4, но анимешникам приятнее видеть mkv.

Но если это ещё можно понять, то любители WebM по сути говорят: «В топку mkv, даёшь mkv!».

ksa242
()
Ответ на: комментарий от max_lapshin

Какой сказочный звездешь про анимешников с их mkv
Контейнер уже порядочно стар и выдержан временем, является чистым контейнером и не зависит от вложенного контента в отличии от mp4
Прежде чем бугуртить ознакомься - http://ru.wikipedia.org/wiki/Сравнение_медиаконтейнеров

anonymous
()
Ответ на: комментарий от max_lapshin

Очень важно понимать, что когда вам гугл ссыт в уши про то, что H264 несвободен, а vp8 свободен, то это именно вам ссут в уши.

Не похоже, что H264 очень уж свободен, но позиция гугла мне тоже не нравится - они вносят свою лепту в сегментирование технологий (вслед за Apple, M$, Adobe). Не парился бы с этим webm+vp9, если бы гугл не сломал в хроме поддержку проигрывания MP4 в HTML5. Собственно, webm до сих пор нужен только для хрома, во всех остальных случаях для показа файлов MP4+H264 работает удовлетворительно (включая Flash).

А вот то, что vp8 нигде вообще не проигрывается — это касается большого количества людей.

Плюсую.

mkv — то же самое. Все задачи полностью решаются в mp4, но анимешникам приятнее видеть mkv.

Matroska стримает поток проще. MP4 требует возможность seek-нуть, чтобы записать moov atom. А Matroska можно пихать прямо в сокет во время генерирования или трансляции, например.

А ещё удивлением выяснил, что FFmpeg по факту умеет корректно муксить и демуксить MJPEG в Matroska, хотя спецификации на этот счёт в проекте Matroska нет.

Krieger_Od ★★
()
Ответ на: комментарий от max_lapshin

А вот то, что vp8 нигде вообще не проигрывается — это касается большого количества людей.
mkv — то же самое.

Мой старый телевизор Philips поддерживает mkv. Не Андроид и вроде даже вообще не под прыщами.

anonymous
()
Ответ на: комментарий от Krieger_Od

Matroska стримает поток проще. MP4 требует возможность seek-нуть, чтобы записать moov atom. А Matroska можно пихать прямо в сокет во время генерирования или трансляции, например.

Вот кстати да, запустил кодирование и можно сразу посмотреть результат, если что отменить и перезапустить с подкоректированными опциями. При кодировании в mp4 оно не воспроизводится пока не завершится кодирование. Поэтому даже когда надо mp4, я обычно сперва кодирую в mkv, а потом перепаковываю в mp4 с -c copy.

anonymous
()

Смотря на чём будешь проигрывать. В соотношении размер/качесвто лучше всего двухпроходное (можно и трёхпроходное) кодирование ffmpeg-ом в h264 и opus + mkv контейнер. Особенно для передачи по сети (многопроходное кодирование гарантирует, что пожмётся всё равномерно, т.е. не будет такого момента, когда средний битрейт 1 Мб/с, скорость инета 1.5 Мб/с, а на 35 минуте битрейт вдруг подскакивает до 2 Мб из-за быстро сменяющейся пёстрой картинки с кучей мелких элементов). Но opus мало что может играть, особенно железного ничего не видел, хотя кодек выше всяких похвал. Если совсем всё свободное хочется, то vp8+opus+mkv. Но ХЗ, проиграет ли это хоть один плеер, vlc и mplayer, вероятно должны. А вообще оставь исходники, скоро будут юзабельны vp9 и h265. Тогда в них пережать надо будет, т.к. размер уменьшится, а качество меньше потеряет.

peregrine ★★★★★
()
Ответ на: комментарий от Krieger_Od

MKV лучше mp4, так как фичастее (даже чёрные полосы можно сделать без перекодирования, правда размер при этом не уменьшится, зато и качество не изменится) и с ним проще работать.

peregrine ★★★★★
()
Ответ на: комментарий от Krieger_Od

Matroska стримает поток проще. MP4 требует возможность seek-нуть, чтобы записать moov atom.

Существует такая штука, как mp4 streaming.

В начале идет moov атом с метаинформацией, но без данных о кадрах, а потом идут блоки с moof атомами, в которых идет информация типа как в moov, но о маленьком фрагменте.

Ровно так же устроен «стриминг» в mkv.

Это два практически идентичных контейнера, которые отличаются только тем, что почему-то возник хайп о том, что якобы mp4 несвободный, а mkv свободный.

Что значит «свободный» кодек или контейнер не сможет объяснить никто, кто яро агитирует за «свободу».

Например «несвободность» H.264 означает то, что существует патентный рэкетир MPEG-LA, который внятно озвучивает условия крышевания. И MPEG-LA на бля обещает вписаться в любые терки, если кто-то другой прессанет вас патентным иском, пока вы крышуетесь у MPEG-LA.

«Свободность» vp8 означает только то, что гугл на какой-то страничке, которую они могут завтра стереть, обещает не подавать на вас в суд, если вы будете использовать vp8. Тот же MPEG-LA держит большой пул патентов, которым могут воспользоваться для судебных исков против кого угодно, кто будет использовать vp8 и гугл не пойдет спасать.

Вот, собственно и вся разница между «свободой» и «несвободой».

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

Существует такая штука, как mp4 streaming.

Интересно. Надо бы реализовать в FFmpeg. Поможете документацией, примерами?

Krieger_Od ★★
()
Ответ на: комментарий от max_lapshin

http://stackoverflow.com/questions/8616855/how-to-output-fragmented-mp4-with-...

Речь о фрагментированном потоке. То есть о чём-то типа MS Smooth Streaming. Но это вовсе не аналогично тому, как mkv поток можно пихать в сокет на лету.

http://libav-users.943685.n4.nabble.com/Libav-user-MOOV-Atom-Not-Found-td4655...

Здесь вроде речь тоже не фрагментированном потоке?

http://gogglesmm.googlecode.com/svn/branches/old_trunk/src/taglib_mp4/mp4tag.cpp

Можно с комментарием, как оно работает? Если я правильно уловил суть первых двух ссылок, то мы с вами имеем в виду разные вещи, так что можете не углубляться в объяснение.

Krieger_Od ★★
()
Последнее исправление: Krieger_Od (всего исправлений: 1)
Ответ на: комментарий от Krieger_Od

Вы меня прям заставили сомневаться.

Я был уверен, что техника именно такая: вначале отправляется полупустой moov, в а потом досылаются куски moof + mdat прям как в webm.

Я могу и ошибаться: эта штука так же не нужна, как и webm или flv, так что я на 100% не проверял.

max_lapshin ★★★★★
()
Ответ на: комментарий от Krieger_Od

Вот, смотрите как выглядит структура такого псевдостриминга:

ftyp 
moov 
sidx 
moof 
 mfhd sequence=1
 traf 
  tfhd duration_empty=0,flags=undefined,size=undefined,duration=3600,description=undefined,offset=undefined,track=1
  tfdt 
  trun sample_count=135,data_offset=1716
       duration=undefined,size=65914,flags=0,ctime=0
       duration=undefined,size=3600,flags=34982,ctime=34982
       duration=undefined,size=65536,flags=7200,ctime=7200
...
mdat mdat=2687488,<<0,1,1,118,101,136,132,1,255,235>>
moof 
 mfhd sequence=2
 traf 
  tfhd duration_empty=0,flags=undefined,size=undefined,duration=3600,description=undefined,offset=undefined,track=1
  tfdt 
  trun sample_count=135,data_offset=1716
       duration=undefined,size=46896,flags=0,ctime=0
       duration=undefined,size=3600,flags=22765,ctime=22765
       duration=undefined,size=65536,flags=3600,ctime=3600
       duration=undefined,size=25288,flags=65536,ctime=65536
       duration=undefined,size=3600,flags=24925,ctime=24925
max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

Это мало что мне говорит само по себе. Вопрос в том, когда у нас «готов» moov, что в нём находится (я честно признаюсь - не знаю), и можем ли мы отправлять валидный для проигрывания _всего потока_ moov в самом начале вещания.

Krieger_Od ★★
()
Ответ на: комментарий от Krieger_Od

а, понял вас.

В обычном moov хранится два типа данных:

1) метаданные с SPS/PPS, AAC config и прочая лабуда типа битрейта, каналов и языков треков

2) информация о смещениях, размерах и длительностях чанков с семплами

В фрагментированном mp4 второе идет не в moov, а в серии moof атомов.

max_lapshin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.