소스 .mov 파일을 .ogg, .mp4 및 .webm 출력으로 트랜스 코딩하는 애플리케이션을 개발했습니다. 현재 AWS EC2 인스턴스 g2.8xlarge에서 실행 중입니다. 작동합니다 (예!).

내 질문 : -threads 0를 ffmpeg 명령에 전달하지만 (실제로는 구성 ( php-ffmpeg )), 실행중인 프로세스는 때때로 단일 코어에서만 실행됩니다. 왜 이런 일이 발생합니까? htop 명령의 아래 출력을 참조하세요.

htop 출력

보시다시피 , 코어 # 21이 최대치입니다. 몇 초 안에 내가 원하는대로 모든 항목을 최대로 사용하지 않고 인코딩 프로세스의 속도를 크게 높이는 것이 아니라 다른 항목으로 전환 할 것입니다. 상황은 일시적입니다. 일부 실행 중에는 모든 프로세서가 최대 값이되었지만 다른 경우에는 그렇지 않으며 하나의 프로세서 만 사용합니다. 동료는 일부 형식에 사용하는 코덱이 인코딩 중에 멀티 스레드 실행을 지원하지 않는다고 말했습니다. 아직 관찰중인 동작인지 확인할 수 없지만

이 경우입니까? 그렇다면 위의 형식에 대해 어떤 코덱을 사용하여 이러한 대상 형식으로 트랜스 코딩 할 수 있습니다. 사용 가능한 모든 하드웨어? php-ffmpeg에 설정된 기본 코덱은 다음과 같습니다.

 Video Audio Ogg libtheora libvorbis WebM libvpx libvorbis X264 libx264 libfaac 

업데이트

실행중인 프로세스를 살펴보면 다음은 MP4에 대해 실행되는 ffmpeg 명령입니다 (현재 32 코어 모두 포화 상태).

실제로이 명령을 직접 빌드하지는 않습니다. php-ffmpeg는 수행 할 작업에 대해 최소한 어느 정도는 제어 할 수 있다고 생각하지만 (예를 들어 처음에 여러 개의 -metadata:s:v:0 항목이있는 이유를 모르겠습니다.)

댓글

  • ' 중복 된 옵션 (-s 세 번 제외)을 제외하고 해당 명령 줄에 많은 문제 요소가 있습니다. , 다른 크기를 가진 마지막 것). 다수의 인수를 현재 기본값으로 명시 적으로 설정 (예 : -i_qfactor, -subq, -qcomp)는 이상하며 향후 libx264에서 나쁜 결과를 줄 수 있습니다. (아마도 아니 겠지만 libx264가 상당히 많이 수행되고 안정적이기 때문입니다. 과중한 개발이 아닙니다. x265에 대해 이와 같은 작업을 수행했다면 나쁠 것입니다.) 어쨌든 2 패스 1200k는 괜찮지 만 타겟을 선호 할 수 있습니다. -품질 crf. ' -preset를 지정하지 않습니다. : (
  • libfaac는 ' libfdk_aac만큼 좋지 않습니다. . ' 유료 서비스에서 이것을 사용하는 경우 '하지만 libfdk_aac의 라이선스를 확인해야합니다. 또한이 cmdline에는 -movflags +faststart
  • 가 없습니다.

  • Fmpeg가 동일한 항목에서 여러 출력을 생성하도록 할 수도 있습니다. ' 입력. 명령 줄에 여러 개의 출력 옵션 출력 파일 이름 시퀀스가 있습니다. 따라서 대체로 php-ffmpeg에 만족하지 않습니다 ' '는 cmdline의 종류입니다. 한 번에 여러 출력을 생성하기 위해 다르게 사용할 수 있으므로 ' t 단일 스레드 theora 단계 여야합니다. 어쨌든 작동한다면 훌륭하지만 인코더 기본값의 변경과 x264 subme 레벨 변경의 의미를주의하십시오. cmdline이 품질을 떨어 뜨립니다.
  • @Peter 감사합니다. 여기에 대한 대답은 실제로 cmd가 빌드되는 방식을 디버그해야한다는 것입니다. 실제로 여러 출력을 해당 명령에 넣을 수 있다면 하드웨어 부하를 최대화하는 더 좋은 기회를 얻을 수있을 것 같습니다.
  • trac.ffmpeg .org / wiki / Creating % 20multiple % 20outputs . 그리고 예, '가 아마도 최선이라는 데 동의합니다. 그렇지 않으면 ' 일정 시간 동안 단일 스레드 작업을 수행하고 다른 시간 동안 모든 코어를로드하는 작업이 있습니다. 그런 식으로 작동하는 작업을 예약하기가 어렵습니다.

답변

BTW,이 질문은 stackoverflow에서 더 나을 수 있습니다. 또는 unix.stackexchange 또는 serverfault 일 수 있습니다. 이 사이트는 “창의적인 장점이나 최소한 지각적인 비디오 / 오디오 품질에 기반한 결정을 포함하지 않는 질문에 덜 초점을 맞춘 것 같습니다. 그러나 기술 세부 사항에 관한 모든 것이므로 대답하겠습니다.

FFmpeg는 기본적으로 멀티 스레딩을 사용하므로 -threads 0가 필요하지 않습니다. 인코딩이 단일 스레드 필터 또는 디코더에서 병목 현상이 발생하는 경우 하나의 코어에서 전체로드가 발생하고 다른 많은 코어에서 약간의로드가 표시됩니다.

할 수있는 한 가지는 출력 비디오의 mediainfo를 확인하는 것입니다. x264는 설정을 h.264 헤더의 ASCII 문자열에 둡니다. 따라서 strings -n20 또는 mediainfo 중 하나를 가져옵니다.

... Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Progressive Bits/(Pixel*Frame) : 0.051 Stream size : 455 MiB (89%) Writing library : x264 core 146 r2538+1 d48ec67 Encoding settings : cabac=1 / ref=6 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=0.70:0.10 / mixed_ref=1 / me_range=24 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-3 / threads=4 / lookahead_threads=1 / sliced_threads=0 / nr=50 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=5 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=1 / crf=22.5 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=3:0.60 Color primaries : BT.709 Transfer characteristics : BT.709 Matrix coefficients : BT.709 

참고 거기에 “threads = 4″가 있습니다. CPU 집약적 인 필터 (hqdn3d 및 lanczos-downscale)가 실행 중이기 때문에 x264가 기본 CPU * 1.5를 사용하도록하는 대신 쿼드 코어 i5 2500k에서 수동으로 설정 한 것 같습니다.

어쨌든, slower와 같은 사전 설정이있는 libx264는 많은 코어를 바쁘게 유지하는 데 문제가 없어야합니다 . 본질적으로 직렬 인 인코딩 부분 (예 : 최종 비트 스트림의 CABAC 인코딩)이 있으므로 CPU 시간을 다듬는 참조를 많이 사용하지 않는 높은 비트 전송률 비디오 (높은 subme) 여러 프레임 (높은 ref)에 대한로드 패턴이 귀하와 같은로드 패턴을 표시 할 수 있습니다 (하나의 스레드는 100 % CPU를 사용하고 다른 스레드는 그렇지 않음).

I “빠른 사전 설정이 덜 병렬인지 100 % 확신 할 수는 없지만 CABAC가 직렬이라는 것을 알고 있습니다.

대량 병렬화하기 위해 libx264는 RAM의 보트로드를 사용하여 프레임을 유지하고 계속해서 2를 예측할 수 있습니다. 또는 더 많은 GOP를 사용하고이를 독립적으로 인코딩합니다. 하지만 이러한 방식으로 작동 할 수있는 옵션은 없습니다.

많은 코어를 사용하는 한 가지 방법은 모든 코어를 사용하는 일련의 단일 인코딩 대신 여러 개의 개별 인코딩을 병렬로 실행하는 것입니다. 이는 개별적으로 인코딩하려는 여러 입력 파일이있는 경우에만 작동합니다. 별도의 L3 및 DRAM이있는 다중 소켓 시스템에있는 경우가 아니라면 스레딩 오버 헤드와 더 많은 메모리 용량 및 대역폭을 교환합니다 (캐싱에 영향을 미침). CPU의 각 클러스터에 대해 그리고 프로세스가 코어에 고정되어 하나의 인코딩이 한 소켓의 코어를 사용하고 다른 하나는 다른 소켓을 사용합니다.

댓글

  • 통찰 해 주셔서 감사합니다. 주로 ' " 코드 " 뒤에서 일어나는 일에 대해 자세히 알아보고 이것이 더 적합 할 것이라고 생각했습니다. 저는 ' 운영자가 마이그레이션 할 수 있도록 플래그를 지정하고 전화를 걸 수 있습니다.
  • 지금은 ' 각 파일에 대한 링크가있는 AWS SQS 대기열에 메시지를 다시 고정합니다. 이 인스턴스에는 해당 메시지를 수신하고, 파일을 다운로드하고, 트랜스 코딩하고, 완료 될 때마다 출력 파일을 업로드하는 작업이 실행 중입니다. 이 내용을 올바르게 읽고 있다면 '이 작업자 프로세스 중 몇 개를 시작하고 여러 파일을 병렬로 트랜스 코딩하는 것이 더 합리적이라고 말씀하신 것입니다. 모든 코어를 단일 프로세스에 집중하려고합니까?
  • 예, ' 더 많은 코어를 포화시키는 데 문제가있는 경우 ' 인코딩 또는 3을 병렬로 실행하는 것이 좋습니다. x264가 32 코어 대부분을 포화시킬 수있을 것이라고 생각하지만, 아마도 더 느린 프리셋으로 만 가능할 것입니다. 질문에 ffmpeg cmdline 옵션과 콘솔 출력을 게시하십시오. ' -preset veryfast와 같이 어리 석고 낮은 품질을 사용하는 경우 IDK를 사용하세요. 그렇다면 입력 디코딩은 단일 스레드 병목 현상 일 수 있습니다. 또는 제가 말했듯이 느린 필터 일 수도 있습니다.
  • 당신은 ' 확실히 한 xcode의 다운로드 / 업로드를 다른 xcode의 CPU 사용량과 겹치고 싶을 것입니다. xcode. ' 프로덕션 용으로 즉석에서 ffmpeg로 /에서 스트리밍 할 계획이없는 경우. (다른 muxer를 사용하여 -movflags +faststart에 해당하는 것을 즉석에서 얻을 수 있을 수 있습니다 . 이에 대해 읽어 본 것 같습니다. 그렇지 않으면 ' mp4를 출력하려면 ffmpeg가 moov 아톰을 앞에 놓고 데이터를 섞을 수 있도록 파일로 출력해야합니다. 인코딩이 완료되면.)
  • 아, 방금 Q를 더 자세히 읽었습니다. ' 3 가지 형식을 모두 한 번에 출력하는 경우 (동일한 ffmpeg 명령 줄을 사용하여 입력 디코딩은 한 번만 수행하면 됨), 3 개의 인코더 중 하나가 단일 스레드이므로 전체 프로세스에 병목 현상이 발생합니다. libtheora는 다중 스레드가 아니라 라고 생각합니다. wiki.xiph.org/TheoraEncoders 는 다중 스레드 포크가 있다고 말했지만 사망했습니다. (잘 작동하지 않았거나 ' 다른 인코더 개선 사항과 호환되지 않았습니까? 병합되지 않은 많은 이유가 ' 일 수 있습니다. lists.xiph.org/pipermail//theora-dev/2015-February/004374.html

Answer

libtheora는 단일 스레드입니다. 다중 스레드 실험용 빌드가 있지만 유지 관리되지 않습니다. 다른 인코딩과 병렬로 실행하는 것이 좋습니다. 또한 가능하면 libfaac보다 libfdk-aac를 사용하십시오.동일한 비트 전송률에서 훨씬 더 높은 오디오 충실도.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다