2016-08-12 6 views
4

Я довольно новичок в ffmpeg, но после нескольких дней поиска по этой проблеме я полностью ударил по кирпичной стене. Любая помощь будет оценена по достоинству.ffmpeg конкатенация после использования фильтра drawtext

Мой прецедент: Наш клиент хочет загрузить видеоролики для нескольких регионов. Каждое видео будет иметь тот же формат, 1920x1080, mp4. Для каждого региона они хотят добавить другое изображение в конце видео в течение нескольких секунд. Это изображение содержит их логотип, дополнительную информацию и переменный код. Они будут вводить этот код вместе с загруженным видео. Изображение остается прежним, поэтому оно уже присутствует на сервере. Так что в основном у меня есть входное видео, видеоизображение и небольшой код. Мне нужно добавить этот код к видеоизображению (в предопределенной позиции), а затем мне нужно добавить результирующее видео в конец входного видео. Как только это будет завершено, мне просто нужно вывести видео в 1920x1080 и 1024x576.

Я пробовал несколько вещей, но шаг конкатенации всегда терпит неудачу с манипулируемым видео.

Покушение 1

В моей первой попытке, я использовал FFmpeg для создания видео из изображения, а также добавить текст в указанной области.

ffmpeg -y -f lavfi -i image.png -r 30 -t 10 -pix_fmt yuv420p -map 0:v -vf drawtext="fontfile=HelveticaNeue.dfont: text='GLNS/TEST/1234b': fontcolor=black: fontsize=20: box=1: boxcolor=white: boxborderw=7: x=179: y=805" imageVideo.mp4 

Эта команда создает .mp4 видео нужного размера, с длительностью 10 секунд, и добавляет текст «GLNS/TEST/1234b» в правильном месте.

Далее я использую следующую команду, чтобы объединить два видео. Оба имеют одинаковое разрешение и кодек.

ffmpeg -f concat -safe 0 -i config.txt -vf scale=1920:1080 outputHD.mp4 -vf scale=1024:576 outputSD.mp4 

config.txt содержит следующее:

file my_input_file.mp4 
file ImageVideo.mp4 

Это объединение работает с регулярным видео. Однако, когда я использую его с ImageVideo.mp4 (созданным с помощью первой команды) Я получаю этот журнал ошибок:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f86dc924600] Auto-inserting h264_mp4toannexb bitstream filtereed=0.509x  
[aac @ 0x7f86dc019e00] Number of bands (31) exceeds limit (5). 
Error while decoding stream #0:1: Invalid data found when processing input 
[aac @ 0x7f86dc019e00] Number of bands (27) exceeds limit (8). 
Error while decoding stream #0:1: Invalid data found when processing input 
[h264 @ 0x7f86dd857200] Error splitting the input into NAL units. 
[h264 @ 0x7f86dd829400] Invalid NAL unit size. 
[h264 @ 0x7f86dd829400] Error splitting the input into NAL units. 
[aac @ 0x7f86dc019e00] Number of bands (10) exceeds limit (1). 
Error while decoding stream #0:1: Invalid data found when processing input 
[h264 @ 0x7f86dd816800] Invalid NAL unit size. 
[h264 @ 0x7f86dd816800] Error splitting the input into NAL units. 
[aac @ 0x7f86dc019e00] Number of bands (24) exceeds limit (1). 
Error while decoding stream #0:1: Invalid data found when processing input 

#this goes on for a few hundred lines 

Результирующего выходной сигнал идентичен входное видео, но не содержит нужное видео изображения в конце.

Покушение 2

С выше попытки не получилось, я попробовал конкатенации видео я позволяю наш дизайнер делает из изображения с Adobe After Effects. Это видео также было сохранено как .mp4 с кодеком H264. Если я конкатенирую входное видео и это, я получаю правильный результат. Однако, как только я добавить код в указанной области с помощью этой команды:

ffmpeg -i new_image_video.mp4 -vf drawtext="fontfile=HelveticaNeue.dfont: text='GLNS/TEST/1234b': fontcolor=black: fontsize=20: box=1: boxcolor=white: boxborderw=7: x=179: y=805" -c:v libx264 imageVideo.mp4 

Я получаю эту ошибку:

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff94c800000] Auto-inserting h264_mp4toannexb bitstream filter97x  
[h264 @ 0x7ff94b053800] top block unavailable for requested intra mode -1 
[h264 @ 0x7ff94b053800] error while decoding MB 0 0, bytestream 49526 
[h264 @ 0x7ff94b053e00] number of reference frames (1+3) exceeds max (3; probably corrupt input), discarding one 
[h264 @ 0x7ff94b053e00] chroma_log2_weight_denom 28 is out of range 
[h264 @ 0x7ff94b053e00] illegal long ref in memory management control operation 2 
[h264 @ 0x7ff94b053e00] cabac_init_idc 32 overflow 
[h264 @ 0x7ff94b053e00] decode_slice_header error 
[h264 @ 0x7ff94b053e00] no frame! 
[h264 @ 0x7ff94b053800] concealing 8160 DC, 8160 AC, 8160 MV errors in I frame 
[h264 @ 0x7ff94b072a00] reference overflow 22 > 15 or 0 > 15 
[h264 @ 0x7ff94b072a00] decode_slice_header error 
[h264 @ 0x7ff94b072a00] no frame! 
[h264 @ 0x7ff94b01a400] illegal modification_of_pic_nums_idc 20 
[h264 @ 0x7ff94b01a400] decode_slice_header error 
[h264 @ 0x7ff94b01a400] no frame! 
[h264 @ 0x7ff94b01aa00] illegal modification_of_pic_nums_idc 20 
[h264 @ 0x7ff94b01aa00] decode_slice_header error 
[h264 @ 0x7ff94b01aa00] no frame! 
Error while decoding stream #0:0: Invalid data found when processing input 
[h264 @ 0x7ff94b053800] deblocking_filter_idc 8 out of range 
[h264 @ 0x7ff94b053800] decode_slice_header error 
[h264 @ 0x7ff94b053800] no frame! 
Error while decoding stream #0:0: Invalid data found when processing input 
[h264 @ 0x7ff94b053e00] illegal memory management control operation 8 
[h264 @ 0x7ff94b053e00] co located POCs unavailable 
[h264 @ 0x7ff94b053e00] error while decoding MB 2 0, bytestream -35 
[h264 @ 0x7ff94b053e00] concealing 8160 DC, 8160 AC, 8160 MV errors in B frame 
[h264 @ 0x7ff94b072a00] number of reference frames (1+3) exceeds max (3; probably corrupt input), discarding one 

# this goes on for a while... 

[h264 @ 0x7ff94b01a400] concealing 4962 DC, 4962 AC, 4962 MV errors in B frame 
Error while decoding stream #0:0: Invalid data found when processing input 
frame= 2553 fps= 17 q=-1.0 Lsize= 26995kB time=00:01:42.16 bitrate=2164.6kbits/s dup=0 drop=60 speed=0.697x  
video:25258kB audio:1661kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.285236% 
[libx264 @ 0x7ff94b810400] frame I:35 Avg QP:17.45 size: 55070 
[libx264 @ 0x7ff94b810400] frame P:711 Avg QP:19.73 size: 18712 
[libx264 @ 0x7ff94b810400] frame B:1807 Avg QP:21.53 size: 5884 
[libx264 @ 0x7ff94b810400] consecutive B-frames: 3.4% 5.0% 4.9% 86.6% 
[libx264 @ 0x7ff94b810400] mb I I16..4: 38.2% 49.3% 12.5% 
[libx264 @ 0x7ff94b810400] mb P I16..4: 12.4% 14.0% 1.0% P16..4: 29.6% 4.8% 1.9% 0.0% 0.0% skip:36.2% 
[libx264 @ 0x7ff94b810400] mb B I16..4: 1.5% 1.2% 0.1% B16..8: 27.3% 1.6% 0.1% direct: 1.8% skip:66.4% L0:45.8% L1:51.4% BI: 2.8% 
[libx264 @ 0x7ff94b810400] 8x8 transform intra:49.5% inter:85.4% 
[libx264 @ 0x7ff94b810400] coded y,uvDC,uvAC intra: 21.2% 22.3% 2.5% inter: 4.6% 7.0% 0.0% 
[libx264 @ 0x7ff94b810400] i16 v,h,dc,p: 23% 26% 10% 41% 
[libx264 @ 0x7ff94b810400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 19% 35% 3% 3% 3% 3% 3% 2% 
[libx264 @ 0x7ff94b810400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 20% 16% 5% 7% 6% 5% 5% 4% 
[libx264 @ 0x7ff94b810400] i8c dc,h,v,p: 67% 16% 15% 2% 
[libx264 @ 0x7ff94b810400] Weighted P-Frames: Y:7.3% UV:4.2% 
[libx264 @ 0x7ff94b810400] ref P L0: 66.3% 8.7% 17.9% 7.0% 0.1% 
[libx264 @ 0x7ff94b810400] ref B L0: 88.2% 10.1% 1.7% 
[libx264 @ 0x7ff94b810400] ref B L1: 94.9% 5.1% 
[libx264 @ 0x7ff94b810400] kb/s:2026.12 
[aac @ 0x7ff94b072400] Qavg: 635.626 

Результирующий выходной сигнал идентичен входному видео, но не содержит желаемое видеоизображение в конце.

Одна вещь, которую я заметил: Когда я проверить видео файлы на макинтош (Получить информацию), они всегда содержат эти строки на «Больше информации»:

Dimensions: 1920 x 1080 
Codecs: H.264, AAC 
Color profile: HD(1-1-1) 
Duration: 01:42 
Audio channels: 2 
Last opened: Today 11:02 

Однако видео, который проходит через DrawText фильтр есть следующее:

Dimensions: 1920 x 1080 
Codecs: AAC, H.264 
Duration: 00:10 
Audio channels: 2 
Last opened: Today 11:07 

Как вы можете видеть, запись цветового профиля отсутствует, а кодеки переключаются местами. Я предполагаю, что это связано с моей проблемой, но я не могу найти исправления.

PS: Приложение будет работать в среде php (Symfony). Я заметил, что команда concat не была доступна в пакете Symfony для ffmpeg, поэтому я использую обычные команды терминала. Я выполнил их с помощью php.

EDIT Покушения 3

На посоветуйте из сотрудника, я попытался преобразовать видео в .avi и переконвертировании к .mp4, в надежде, это потеряет любую поврежденную или дополнительную информацию, включенную в DrawText фильтре , Это выливает совершенно другую ошибку.

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f812413da00] Auto-inserting h264_mp4toannexb bitstream filtereed=0.516x  
[concat @ 0x7f8124009a00] DTS 1569260 < 2551000 out of order 
[h264 @ 0x7f8124846800] left block unavailable for requested intra4x4 mode -1 
[h264 @ 0x7f8124846800] error while decoding MB 0 0, bytestream 47919 
[h264 @ 0x7f8124846800] concealing 8160 DC, 8160 AC, 8160 MV errors in I frame 
[aac @ 0x7f8125809a00] Queue input is backward in time 
[aac @ 0x7f8125815a00] Queue input is backward in time 
[h264 @ 0x7f8124846e00] number of reference frames (1+3) exceeds max (3; probably corrupt input), discarding one 
[h264 @ 0x7f8124846e00] chroma_log2_weight_denom 26 is out of range 
[h264 @ 0x7f8124846e00] deblocking_filter_idc 32 out of range 
[h264 @ 0x7f8124846e00] decode_slice_header error 
[h264 @ 0x7f8124846e00] no frame! 
[mp4 @ 0x7f8124802200] Non-monotonous DTS in output stream 0:1; previous: 4902912, current: 4505491; changing to 4902913. This may result in incorrect timestamps in the output file. 
[mp4 @ 0x7f8125813000] Non-monotonous DTS in output stream 1:1; previous: 4902912, current: 4505491; changing to 4902913. This may result in incorrect timestamps in the output file. 
[h264 @ 0x7f8124803400] reference overflow 20 > 15 or 0 > 15 
[h264 @ 0x7f8124803400] decode_slice_header error 
[h264 @ 0x7f8124803400] no frame! 
[mp4 @ 0x7f8124802200] Non-monotonous DTS in output stream 0:1; previous: 4902913, current: 4506515; changing to 4902914. This may result in incorrect timestamps in the output file. 
[mp4 @ 0x7f8125813000] Non-monotonous DTS in output stream 1:1; previous: 4902913, current: 4506515; changing to 4902914. This may result in incorrect timestamps in the output file. 
[mp4 @ 0x7f8124802200] Non-monotonous DTS in output stream 0:1; previous: 4902914, current: 4507539; changing to 4902915. This may result in incorrect timestamps in the output file. 
[mp4 @ 0x7f8125813000] Non-monotonous DTS in output stream 1:1; previous: 4902914, current: 4507539; changing to 4902915. This may result in incorrect timestamps in the output file. 

# Again, this continues for quite a while. 

ответ

2

Используйте вместо этого фильтр concat и выполните его в одной команде.

ffmpeg -i main.mp4 -loop 1 -framerate 30 -t 10 -i image.png 
     -filter_complex "[1]drawtext=fontfile=HelveticaNeue.dfont:text='GLNS/TEST/1234b': 
          fontcolor=black:fontsize=20:box=1:boxcolor=white:boxborderw=7: 
          x=179:y=805[it]; 
         [0:v][it]concat,split[hd][sd]" 
     -map "[hd]" -map 0:a combined1080p.mp4 
     -map "[sd]" -map 0:a -s 1024x576 combined576p.mp4 

Предполагаю, что и ваше основное видео и изображение уже есть 1920x1080.

+1

Для нубов между нами, почему это работает, а другое не удается? – vrwim

+0

Спасибо, много человек, работал как шарм. Нужно было удалить «после drawtext =, хотя это была опечатка. И, как попросил vrwim, вы хотели бы объяснить, почему это работает, а что не так? –

+1

Я не могу окончательно отлаживать ваши команды, но приложению concat demuxer требуется соответствующий порядок потока и соответствующие свойства потока, такие как кодек, разрешение, формат пикселей (хотя и не цветовое пространство), а также такие свойства, как временная база, 0-start PTS, приложения которых, такие как AE, не позволяют пользователю изменять или какие новые пользователи FFmpeg не будут знать, чтобы указать. использовать concat demuxer, когда вы сшиваете сегменты, созданные из того же источника. – Mulvya

Смежные вопросы