2013-06-14 1 views
4

해상도가 480 x 640 인 30 개의 JPEG 이미지 (.jpg)가 있습니다. 각 이미지는 약 20KB (모두 약 600KB)가 소요됩니다.jpeg 이미지를 H264로 매우 빠르게 인코딩하는 방법 (이미지를 비디오로 변환)

나는 H264 형식의 비디오에 이러한 이미지를 인코딩하는 는 FFmpeg 명령을 사용하고 있습니다.

매우 빠른 수행이 필요합니다. 약 1 초.

고전 명령을 사용하여

ffmpeg -y -f image2 -r 1/5 -i image_%d.jpg -c:v libx264 -r 30 video.mp4 

90초 걸립니다.

-preset ultrafast를 추가 한 후 :

ffmpeg -y -f image2 -r 1/5 -i image_%d.jpg -c:v libx264 -preset ultrafast -r 30 video.mp4 

인코딩으로는 충분하지 여전히 약 15 훨씬 낫다 초하지만, 소요

내가 좋아하는, 또한 다른 매개 변수를 시도했다 :

-profile:v baseline 

-qscale:v 

-b:v 1000k 

-crf 24 

인코딩 시간은 10 초 미만으로 떨어지지 않습니다.

필자는 FFmpeg 명령이나 사용해야 할 매개 변수에 익숙하지 않아 여기에이 질문을 게시합니다.

동영상 품질이 좋을 필요가 있고 완벽 할 필요는 없습니다.

참고 사항 : 저는 ProcessBuilder를 사용하여 ffmpeg 실행 파일이있는 Android 애플리케이션에서이 명령을 실행하고 있습니다.

REPLY1 (로버트 Rowntree에) :

ArrayList<String> l2 = new ArrayList<String>(); 

     //l2.add("ffmpeg"); 
     l2.add("/data/data/" + packageName + "/ffmpeg"); 
     l2.add("-y"); 
     l2.add("-loop"); 
     l2.add("1"); 

     l2.add("-i"); 
     l2.add("frame_%d.jpg"); 

//   l2.add("-t"); 
//   l2.add(strngs[3]); 

     l2.add("-r"); 
     l2.add("1/2"); 
     l2.add("-preset"); 
     l2.add("superfast"); 
     l2.add("-tune"); 
     l2.add("zerolatency"); 

//   l2.add("-pass"); 
//   l2.add(Integer.valueOf(pass).toString()); 

     l2.add("-vcodec"); 
     l2.add("libx264"); 
     l2.add("-b:v"); 
     l2.add("200k"); 
     l2.add("-bt"); 
     l2.add("50k"); 
     l2.add("-threads"); 
     l2.add("0"); 
     l2.add("-b_strategy"); 
     l2.add("1"); 

//   if(pass ==1){ 
//    l2.add("-an"); 
//   } else { 
//    l2.add("-acodec"); 
//    l2.add("copy"); 
//   } 

     l2.add("-f"); 
     l2.add("mp4"); 
     l2.add("-strict"); 
     l2.add("-2"); 
//   l2.add("-passlogfile"); 
//   l2.add(strngs[4]); 

//   if(pass ==1){ 
//    l2.add("/dev/null"); 
//   } else { 
//    l2.add(strngs[5]); 
//   } 

     l2.add("video.mp4"); 
     //return l2; 
+0

빠른 해결책이 필요합니다. 비디오 품질에 대해서는별로 신경 쓰지 않습니다. – Paul

답변

0

어떻게 -r 1/5을 제거하기에 대한? 내 인코딩 속도가 빨라졌습니다.

+0

네, 첫 번째 -r은 필요하지 않습니다. 왜냐하면 입력 파일의 프레임 속도를 강제로 사용했기 때문입니다 (원시 형식에만 유효). 그리고 jpecg 파일이 있습니다. – Paul

+0

나는 putput 파일에 fps를 지정해야하기 때문에 초당 5 프레임을 사용하기 위해 두 번째 r을 사용하는 방법을 모르겠습니다. 나는 1/02를 사용했으나 모든 프레임이 비디오에 포함되어있는 것은 아니지만 왜 그런지 모르겠다. 왜 이것이 hapenning인지에 대한 이상이 있습니까? – Paul

+0

-r 5는 모든 입력 프레임을 사용하여 초당 5 프레임을 제공하지 않습니까? – av501

0

IMO - 안드로이드의 ffmpeg는 여전히 모든 소프트웨어입니다 (GPU 또는 하드웨어 가속 없음). 당신 libstagefright/ffmpeg 결합 된 questions을 통해 볼 수 있습니다. 어쨌든, 당신이 빨리 관심이 있다면, 당신은 안드로이드에 하드웨어 가속 솔루션을 찾아야한다. 그렇지 않으면 제약 플랫폼 (배터리 수명, 저전력 CPU)에서 ffmpeg가 다른 플랫폼과 비교할 때 매우 느릴 것입니다.

또한, 나는 때문에 속도의 부족으로 안드로이드에 포기하고로하고는 FFmpeg 인코딩 할 일이 안드로이드 장치에 다운로드하기 전에 미디어를 업로드하는 클라우드 인스턴스에 대한 정착 herethis too

허용 대답을 참조하십시오. 안드로이드에 대한 빠른 결과를 얻을 수 있는지에 관심을 가지시겠습니까?

나는 2 패스 H264 표현을 사용하여 아래의 코드를 사용하여 인코딩을 안드로이드에서 포기합니다.

private ArrayList<String> mapFfmpegSwitches(String... strngs){ 
    ArrayList<String> l2 = new ArrayList<String>(); 
    l2.add("ffmpeg"); 
    l2.add("-y"); 
    l2.add("-loop"); 
    l2.add("1"); 
    l2.add("-i"); 
    l2.add(strngs[1]); 
    l2.add("-i"); 
    l2.add(strngs[2]); 
    l2.add("-t"); 
    l2.add(strngs[3]); 
    l2.add("-r"); 
    l2.add("1/2"); 
    l2.add("-preset"); 
    l2.add("superfast"); 
    l2.add("-tune"); 
    l2.add("zerolatency");    
    l2.add("-pass"); 
    l2.add(Integer.valueOf(pass).toString()); 
    l2.add("-vcodec"); 
    l2.add("libx264"); 
    l2.add("-b:v"); 
    l2.add("200k"); 
    l2.add("-bt"); 
    l2.add("50k"); 
    l2.add("-threads"); 
    l2.add("0"); 
    l2.add("-b_strategy"); 
    l2.add("1"); 
    if(pass ==1){ 
     l2.add("-an"); 
    } else { 
     l2.add("-acodec"); 
     l2.add("copy"); 
    } 
    l2.add("-f"); 
    l2.add("mp4"); 
    l2.add("-strict"); 
    l2.add("-2"); 
    l2.add("-passlogfile"); 
    l2.add(strngs[4]); 

    if(pass ==1){ 
     l2.add("/dev/null"); 
    } else { 
     l2.add(strngs[5]); 
    }  
    return l2; 
} 
+0

안녕하세요. 귀하의 답변에 감사드립니다. 몇 시간 후에 당신의 버전을 시험해 보겠습니다. 위의 명령으로 인코딩하려고 시도한 프레임의 수와 시간을 알려주시겠습니까? – Paul

+0

약 4 FPS 내가 안드로이드에 대해 생각 ... 심지어 muxing 비디오를위한 안드로이드 가치있는 플랫폼을 만들기 위해 25 FPS 주위에 있어야합니다. –

+0

또는 10 초. 2 개의 사진과 -r 1/2의 사운드 입력은 안드로이드에서 1 분, Heroku 인스턴스의 mux에서 약 4 초 걸립니다. –

0

recordvideo으로 하드웨어 인코더를 사용해 볼 수 있습니다.전체 시스템을 빌드하지 않더라도 stagefright 명령 줄 도구를 다운로드하고 컴파일 할 수 있습니다. 연결할 시스템 라이브러리가 필요합니다. 생성 된 실행 파일은 YUV 버퍼를 mp4로 변환합니다. 여전히 일련의 JPEG를 하나의 YUV 파일로 변환해야합니다. ffmpeg로 충분히 빠르다고 생각하지만 libjpeg-turbo for android을 사용할 수도 있습니다.

+0

답장과 링크를 보내 주셔서 감사합니다. 불행히도 내가 ffmpeg를 사용해야하는 순간 ... 어쩌면 미래에 나는 제안을 시도하고 결과에 대해 알게 될 것입니다. thanks – Paul

+0

stagefright를 사용하기 위해 ffmpeg를 컴파일하는 것은 어떻습니까? 또는 멀티 스레드 x264를 사용 하시겠습니까? –

+0

S3의 하드웨어 인코더를 사용하면 초당 60 개의 VGA 프레임을 얻을 수 있고 sw 인코더는 2 개의 스레드가있는 30 개입니다. 얼마나 많은 시간 JPEG MPEG 디코더 걸릴 ffmpeg 모르겠다. –