1

Silicondust HDHomerunチューナーから取得したmpegtsビデオファイルがたくさんあります。gstreamer 0.10 では、シークが非常に遅かった (以前の投稿を参照)。シークは (1.0.6 で) 大幅に改善されましたが、まだ問題があります。ここにいくつかの標準出力があります:

$ ./fullscreen02

No accelerated IMDCT transform found
No accelerated IMDCT transform found
pos_ns: 1700833333, seek_ns: 11700833333
position: 0:00:11.700833333

(fullscreen02:30989): GStreamer-CRITICAL **: gst_segment_do_seek: assertion `segment->format == format' failed

(fullscreen02:30989): GStreamer-CRITICAL **: gst_segment_do_seek: assertion `segment->format == format' failed
Seek failed!
pos_ns: 1878166666, seek_ns: 11878166666
position: 0:00:11.878166666

(fullscreen02:30989): GStreamer-CRITICAL **: gst_segment_do_seek: assertion `segment->format == format' failed

(fullscreen02:30989): GStreamer-CRITICAL **: gst_segment_do_seek: assertion `segment->format == format' failed
Seek failed!
pos_ns: 1468916666, seek_ns: 11468916666
position: 0:00:11.468916666

(fullscreen02:30989): GStreamer-CRITICAL **: gst_segment_do_seek: assertion `segment->format == format' failed

(fullscreen02:30989): GStreamer-CRITICAL **: gst_segment_do_seek: assertion `segment->format == format' failed
Seek failed!
^C

ここで定義されているように、これが 3 回の 10 秒スキップの出力であるという事実にもかかわらず、pos_ns が前後にジャンプすることがわかります。

        gint64 dur_ns, pos_ns, seek_ns;
        GstFormat format;

        format = GST_FORMAT_TIME;

        if ( !gst_element_query_position(pipeline,format,&pos_ns) )
            g_print("query position failed\n");

        seek_ns = pos_ns + 10*GST_SECOND;
        g_print ("pos_ns: %li, seek_ns: %li\n",pos_ns,seek_ns);
        g_print ("position: %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (seek_ns));

        if ( !gst_element_seek_simple (pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, seek_ns) ) 
          g_print ("Seek failed!\n");

また、画面上では前方へのスキップが成功しているように見えても、gst_element_seek_simple が false を返しているため、シークが失敗したと不平を言っていることも同じ stdout で確認できます。

おそらく関連するバグを見つけましたが、そのパッチがシステムを介して機能するのを待つのではなく、何か間違ったことをしているだけではないことを確信できると思いました.

ファイルの種類に関する追加情報:

$ ffmpeg -i EP00753796.0160_1357005474.67.mpg

[mpeg2video @ 0x629fa0] mpeg_decode_postinit() failure
    Last message repeated 2 times
[mpegts @ 0x626320] PES packet size mismatch
Input #0, mpegts, from 'EP00753796.0160_1357005474.67.mpg':
  Duration: 00:29:59.69, start: 69837.938167, bitrate: 17997 kb/s
  Program 3 
    Stream #0:0[0x31]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 17000 kb/s, 30.43 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x34](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), s16, 384 kb/s
    Stream #0:2[0x35](esl): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, mono, s16, 192 kb/s (visual impaired)

そして私のパイプライン:

pipeline = gst_parse_launch("filesrc location=EP00753796.0160_1357005474.67.mpg ! decodebin name=decoder decoder. ! queue ! audioconvert ! audioresample ! alsasink decoder. ! deinterlace ! videoconvert ! xvimagesink",&error);

同じCプログラム内でplaybinを使用しても同じ動作になりますが。

どんなアイデアでも大歓迎です。ありがとう。

4

0 に答える 0