ffmpeg на android
От: aik Австралия  
Дата: 26.05.25 04:50
Оценка:
Запускаю ffmpeg 7.1.1 на андроид-мотороле для h265->h264 с айпи-камеры:

ffmpeg -hwaccel mediacodec \
-i 'rtsp://monstercam:554/user=admin&password=admin&channel=&stream=.sdp?real_stream--rtp-caching=100' \
-c:a copy \
-c:v h264_mediacodec \
-global_quality:v 100 output.mkv


Первые пару секунд качество нормальное, а потом падает домкратом. Загрузка проца не выше 20%, ffmpeg успевает в реалтайме. -crf, -dp — по барабану. Если поставить "h264" (а не ускоренную h264_mediacodec), то эффект пропадает, но пропадают кадры, потому что уже проц капитально не успевает.

Такое ощущение что кодек h264_mediacodec, заметив сразу после старта что не успевает, портит качество после 2 секунды. Как то можно этому ffmpeg или кодеку объяснить чтоб не умничал? Параметров тьма, результат не меняется. Или "это андроид, а они все кривые"?
Отредактировано 26.05.2025 5:17 aik . Предыдущая версия .
Re: ffmpeg на android
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 26.05.25 09:19
Оценка:
Здравствуйте, aik, Вы писали:

aik>Первые пару секунд качество нормальное, а потом падает домкратом. Загрузка проца не выше 20%, ffmpeg успевает в реалтайме. -crf, -dp — по барабану. Если поставить "h264" (а не ускоренную h264_mediacodec), то эффект пропадает, но пропадают кадры, потому что уже проц капитально не успевает.


Про андроид не знаю, но тут явно надо смотреть логи от ffmpeg. Не успевать может и сеть, и запись на диск, банально при низкой загрузке ядра могут сбрасывать частоту и из-за этого не успевать (такое на х86 бывает).
Re[2]: ffmpeg на android
От: aik Австралия  
Дата: 26.05.25 10:47
Оценка:
Здравствуйте, Nuzhny, Вы писали:

aik>>Первые пару секунд качество нормальное, а потом падает домкратом. Загрузка проца не выше 20%, ffmpeg успевает в реалтайме. -crf, -dp — по барабану. Если поставить "h264" (а не ускоренную h264_mediacodec), то эффект пропадает, но пропадают кадры, потому что уже проц капитально не успевает.

N>Про андроид не знаю, но тут явно надо смотреть логи от ffmpeg. Не успевать может и сеть, и запись на диск, банально при низкой загрузке ядра могут сбрасывать частоту и из-за этого не успевать (такое на х86 бывает).

Ну вот с такой командой top показывает 15..30% (половина из-за aac, но замена на "c:a copy" ничего не меняет в видео), сеть гигабит, не надо никуда ничего писать в телефоне (хотя он бы осилил). Этот ffmpeg всегда ругается на что то, но всё работает.

ffmpeg -hwaccel mediacodec -i 'rtsp://monstercam:554/user=admin&password=admin&channel=&stream=.sdp?real_stream--rtp-caching=100' -c:a aac -c:v h264_mediacodec -f rtsp -rtsp_transport tcp rtsp://srv:8554/roof

  лог
[udp @ 0x79fb4e5fc0] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[udp @ 0x79fb4e6060] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[udp @ 0x79fb4e61a0] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[udp @ 0x79fb4e6240] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
[rtsp @ 0x79fb496280] max delay reached. need to consume packet
[rtsp @ 0x79fb496280] RTP: missed 3 packets
[rtsp @ 0x79fb496280] max delay reached. need to consume packet
[rtsp @ 0x79fb496280] RTP: missed 6 packets
Input #0, rtsp, from 'rtsp://monstercam:554/user=admin&password=admin&channel=&stream=.sdp?real_stream--rtp-caching=100':
  Metadata:
    title           : RTSP Session
  Duration: N/A, start: 0.000000, bitrate: N/A 
  Stream #0:0: Video: hevc (Main), yuv420p(tv), 2304x2592, 6 fps, 6 tbr, 90k tbn 
  Stream #0:1: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s
[hevc_mediacodec @ 0x79fb422500] Both surface and native_window are NULL
[hevc_mediacodec @ 0x79fb422500] Using surface 0x0 
[hevc_mediacodec @ 0x79fb422500] No Java virtual machine has been registered
[hevc_mediacodec @ 0x79fb422500] Failed to getCodecNameByType
[hevc_mediacodec @ 0x79fb422500] Output crop parameters top=0 bottom=2591 left=0 right=2303, resulting dimensions width=2304 height=2592
[hevc_mediacodec @ 0x79fb422500] MediaCodec started successfully: codec = OMX.qcom.video.decoder.hevc, ret = 0 
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (hevc_mediacodec) -> h264 (h264_mediacodec))
  Stream #0:1 -> #0:1 (pcm_alaw (native) -> aac (native))
Press [q] to stop, [?] for help
[hevc_mediacodec @ 0x79fb422500] Input packet is missing PTS 
[aac @ 0x79fb422c00] Too many bits 8832.000000 > 6144 per frame requested, clamping to max 
[hevc_mediacodec @ 0x79fb422500] Output MediaFormat changed to mime: string(video/raw), stride: int32(2304), slice-height: int32(2592), color-format: int32(21)
, image-data: data, crop: Rect(0, 0, 2303, 2591), hdr-static-info: data, width: int32(2304), height: int32(2592)}
[hevc_mediacodec @ 0x79fb422500] Output crop parameters top=0 bottom=2591 left=0 right=2303, resulting dimensions width=2304 height=2592
Output #0, rtsp, to 'rtsp://srv:8554/roof':
  Metadata:
    title           : RTSP Session
    encoder         : Lavf61.7.100
  Stream #0:0: Video: h264, nv12(tv, progressive), 2304x2592, q=2-31, 200 kb/s, 6 fps, 90k tbn 
      Metadata:
        encoder         : Lavc61.19.101 h264_mediacodec
  Stream #0:1: Audio: aac (LC), 8000 Hz, mono, fltp, 48 kb/s
      Metadata:
        encoder         : Lavc61.19.101 aac 
frame=  921 fps=6.2 q=-0.0 size=N/A time=00:02:33.05 bitrate=N/A dup=0 drop=36 speed=1.02x


Попробовал тоже самое на пикселе6 — ровно та же хрень — если h264_mediacodec, то качество быстро падает, если h264 — то едва успевает кодировать, но качество не падает. Если запускать ffmpeg на нормальном компе — то всё успевает (но ругается регулярно на "RTP: missed 7 packets" и "max delay reached. need to consume packetdup=0 drop=4 speed= 1.1x").

ps. самая тоска это что, похоже, андроид не даёт сразу 3 потока транскодить, а хотелось чего то такого. эх.
Отредактировано 26.05.2025 11:19 aik . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.