#macos #ffmpeg #h.264 #libx264
#macos #ffmpeg #ч.264 #libx264
Вопрос:
Я снимаю поток RTSP с камеры безопасности и перекодирую его для (прямой трансляции) на iphone, используя OSX в качестве платформы кодирования. У меня все работает правильно, и я настраиваю его. Однако, похоже, что он не выводит запрошенное разрешение. Это мой сценарий
/Applications/SecurityCamera/openRTSP -v -c -t rtsp://10.0.1.118/ch1-s1 |
/Applications/SecurityCamera/ffmpeg
-r 10 -i -
-y -an -ab 64000 -f mpegts -vcodec copy -s 960x640
-flags loop -cmp chroma -partitions parti4x4 partp8x8 partb8x8
-subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25
-sc_threshold 40 -i_qfactor 0.71 -bt 400k -maxrate 524288 -bufsize 524288
-qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30
-aspect 960:640 -r 10 -g 10 -async 2 -
|/Applications/SecurityCamera/mediastreamsegmenter -b http://localhost:8080/
-f /Library/WebServer/Documents/ -i stream.m3u8 -t 10 -s 4 -D
Это отчет о состоянии:
Input #0, h264, from 'pipe:':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: h264, yuv420p, 1600x1200, 10 fps, 10 tbr, 1200k tbn, 20 tbc
[mpegts @ 0x10100c200] muxrate VBR, pcr every 1 pkts, sdt every 200, pat/pmt every 40 pkts
Output #0, mpegts, to 'pipe:':
Metadata:
encoder : Lavf52.93.0
Stream #0.0: Video: libx264, yuv420p, 1600x1200 [PAR 1:1 DAR 4:3], q=2-31, 90k tbn, 10 tbc
Stream mapping:
Stream #0.0 -> #0.0
Вы можете видеть, что он работает, но по какой-то причине выводит 1600×1200. (возможно -vcodec copy
, копирует все параметры кодека, а не только тип кодека?)
Если я изменю значение -vcodec copy
на -vcodec libx264
, я получу правильный отчет о состоянии (с указанием 960×640, правильно), но потоковая передача переключается на 2 кадра в секунду (почему? Я заставляю как ввод, так и вывод!), И он останавливается после 54 кадров (см. Вывод ниже)
Seems stream 0 codec frame rate differs from container frame rate: 20.00 (20/1) -> 10.00 (20/2)
Input #0, h264, from 'pipe:':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: h264, yuv420p, 1600x1200, 10 fps, 10 tbr, 1200k tbn, 20 tbc
[buffer @ 0x100d02420] w:1600 h:1200 pixfmt:yuv420p
[scale @ 0x100d026f0] w:1600 h:1200 fmt:yuv420p -> w:960 h:640 fmt:yuv420p flags:0x4
[libx264 @ 0x10100d400] using SAR=1/1
[libx264 @ 0x10100d400] frame MB size (60x40) > level limit (1620)
[libx264 @ 0x10100d400] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowCTZ SlowAtom
[libx264 @ 0x10100d400] profile Constrained Baseline, level 3.0
[mpegts @ 0x10100c200] muxrate VBR, pcr every 1 pkts, sdt every 200, pat/pmt every 40 pkts
Output #0, mpegts, to 'pipe:':
Metadata:
encoder : Lavf52.93.0
Stream #0.0: Video: libx264, yuv420p, 960x640 [PAR 1:1 DAR 3:2], q=10-51, 200 kb/s, 90k tbn, 10 tbc
Stream mapping:
Stream #0.0 -> #0.0
read pmap fffps= 3 q=37.0 size= 37kB time=0.10 bitrate=3008.0kbits/s bits/s
video pid set at 100
found sequence start
next segment value 1026000
written bytes 376 skipped 0
frame= 54 fps= 2 q=-1.0 Lsize= 160kB time=5.40 bitrate= 242.0kbits/s
video:141kB audio:0kB global headers:0kB muxing overhead 12.872737%
frame I:6 Avg QP:34.68 size: 23524
[libx264 @ 0x10100d400] frame P:48 Avg QP:41.53 size: 75
[libx264 @ 0x10100d400] mb I I16..4: 63.9% 0.0% 36.1%
[libx264 @ 0x10100d400] mb P I16..4: 0.1% 0.0% 0.0% P16..4: 0.8% 0.1% 0.0% 0.0% 0.0% skip:99.0%
[libx264 @ 0x10100d400] final ratefactor: 38.54
[libx264 @ 0x10100d400] coded y,uvDC,uvAC intra: 57.7% 22.3% 2.0% inter: 0.0% 0.1% 0.0%
[libx264 @ 0x10100d400] i16 v,h,dc,p: 23% 35% 27% 15%
[libx264 @ 0x10100d400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 32% 16% 4% 3% 3% 7% 4% 8%
[libx264 @ 0x10100d400] i8c dc,h,v,p: 83% 11% 5% 0%
[libx264 @ 0x10100d400] kb/s:214.43
Комментарии:
1. Примечание для всех, кто пытается сделать то же самое: если вы используете openRTSP, используйте -t, чтобы заставить источник передавать данные по протоколу TCP, а не UDP. Если вы используете ffmpeg, добавьте ?tcp в конец вашего URL-адреса RTSP, это подскажет ffmpeg запросить поток данных по протоколу TCP. Это устраняет многочисленные источники ошибок при декодировании.
Ответ №1:
Как вы уже догадались, -vcodec copy
это не означает «использовать тот же тип кодировки», это означает «передавать данные без изменений». Ни один из множества других параметров, которые вы устанавливаете, ничего не делает с установленным кодеком copy
.
Я предполагаю, что установка этого значения libx264
и, следовательно, фактическое перекодирование видео замедляет его, потому что теперь ему приходится выполнять много работы. Особенно, если входное видео 1600×1200 h264.
В зависимости от ваших потребностей масштабирование в точке отображения определенно будет быстрее, чем перекодирование, в противном случае продолжайте настройку.
Комментарии:
1. Абсолютно верно. Отсутствие ошибок, объясняющих, что буферы были переполнены / переполнены, делало это немного загадочным. Я, наконец, заставил его работать, но мне пришлось снизить разрешение в источнике, в результате чего около 800x600x10 кадров в секунду — это все, что может обработать процессор Atom 330. Я отбросил это еще дальше, потому что вряд ли хотел, чтобы машина была настроена на 100% 24×7. Чувак, как бы я хотел, чтобы материнские платы включали кодировщик H264. Или FPGA! У меня есть дальнейшее обсуждение здесь: doom10.org/index.php?topic=2008.msg9351