2016-10-14 3 views
0

단 하나의 이미지 인 짧은 비디오를 만들려고합니다. (나는 그 바보 같다. 그러나 더 큰 것을 시험해 본다.)mlt XML 및 C 인터페이스에서 일관되지 않은 렌더링 및 생산자 및 avformat 소비자 '보유'

내가 렌더링이 코드는 다음과 같습니다

logo.pngthis file입니다
#include <framework/mlt.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main() { 
    if(mlt_factory_init(NULL)) { 
    mlt_profile p = mlt_profile_init(NULL); 
    mlt_consumer target = mlt_factory_consumer(p, "avformat", 
    mlt_producer source = mlt_factory_producer(p, "hold", "/Users/leif/logo.png"); 
    mlt_producer_set_in_and_out(source, 0, 10); 
    mlt_consumer_connect(target, mlt_producer_service(source)); 
    mlt_consumer_start(target); 

    sleep(5); 
    mlt_consumer_stop(target); 

    mlt_consumer_close(target); 
    mlt_producer_close(source); 
    mlt_factory_close(); 
    } else { 
    printf("No\n"); 
    } 

    return 0; 
} 

.

이 코드를 실행하고 output.mp4을 재생하면 그림이 모두 구식 이어집니다. 중간에 녹색 줄이 있고 로고 자체가 많이 겹쳐져 있습니다.

반면에 소비자를 SDL로 변경하면 이미지가 잘 재생됩니다. 나는 XML, 그리고 다음을 렌더링하기 위해 용융 명령 줄 응용 프로그램을 사용하여 소비자를 변경하는 경우

그리고 마침내 :

melt -consumer avformat:xmlout.mp4 output.xml 

및 비디오를 재생, 또한 잘한다.

내가 설정해야하는 avformat 소비자에게 누락 된 것이 있습니까? 아니면 내가 여기에서 놓친 다른 것?

편집 : 참고로, 출력 된 XML 파일 : output.xml은 다음과 같습니다 관련 bug report에서

<?xml version="1.0" encoding="utf-8"?> 
<mlt LC_NUMERIC="en_US.UTF-8" version="6.2.0" root="/Users/leif/src/video/private" title="Anonymous Submission" parent="producer0" in="0" out="10"> 
     <profile description="DV/DVD PAL" width="720" height="576" progressive="0" sample_aspect_num="16" sample_aspect_den="15" display_aspect_num="4" display_aspect_den="3" frame_rate_num="25" frame_rate_den="1" colorspace="601"/> 
    <producer id="producer0" title="Anonymous Submission" in="0" out="10"> 
    <property name="length">15000</property> 
    <property name="eof">pause</property> 
    <property name="resource">/Users/leif/logo.png</property> 
    <property name="aspect_ratio">1.06667</property> 
    <property name="frame">0</property> 
    <property name="method">onefield</property> 
    <property name="mlt_service">hold</property> 
    <property name="global_feed">1</property> 
    </producer> 
</mlt> 

답변

2

: 프레임 워크 자체가 사이의 계약을 강제하지 않기 때문에

mlt_factory_profile() 실제로 조금 까다 롭고 명확하지 않다 생산자와 소비자. MLT 수퍼 - 프로듀서는 "로더 (loader)"라고 불리우며, 합의를 돕기 위해 일련의 정규화 필터를 추가합니다. 그리고 mlt_factory_producer()에 서비스 매개 변수를 지정하면이 제작자를 우회합니다. 위의 링크 된 코드에서 MLT_PRODUCER에 대한 참조를 볼 수 있습니다.이 참조는 해당 파일의 앞부분에 정의 된 "loader"의 기본값을 갖습니다.

그래서, 정말, 할 일들은 producer_xml.c 정확히 그 일을하는 방법을 XML에 대해서는 mlt_factory_producer(p, NULL, "hold:/Users/leif/logo.png");

, 참조 말을해야 작동합니다.

+0

그래, 내 문제가 해결되었습니다. 고맙습니다. 또한 여러 속성을 전달할 수 있습니까? 마찬가지로 : mlt_factory_producer (p, NULL, "hold : logo.png 너비 : 20 높이 : 20" –

+0

아니요, 서비스에 "인수"(이 경우 생산자) 만 제공 할 수 있습니다 .mlt_properties_set 다른 모든 속성의 경우 –