1

MP4 ファイルを MPEG TS 形式に変換しています。コードはビデオ ファイルの生成を開始しましたが、ビデオとオーディオは超高速で実行されています。avconv -i出力ファイルで(と同じ) を実行ffmpeg -iすると、次の結果が得られます (180 fps!):

Input #0, mpegts, from 'mpegtest_result.ts':
  Duration: 00:01:56.05, start: 0.011111, bitrate: 6356 kb/s
  Program 1 
    Metadata:
      service_name    : Service01
      service_provider: Libav
    Stream #0.0[0x100]: Video: h264 (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 180 fps, 90k tbn, 47.95 tbc
    Stream #0.1[0x101]: Audio: aac, 48000 Hz, stereo, fltp, 126 kb/s

現在、私のコードでは、パケットの PTS 値または DTS 値を変更していません。それが私のビデオを台無しにしていると確信しています。私が変更する唯一のものは、このコードによる time_base です (変数はそれ自体で説明する必要があります)。

if(av_q2d(input_codec_context->time_base) * input_codec_context->ticks_per_frame > av_q2d(input_stream->time_base) && av_q2d(input_stream->time_base) < 1.0/1000) {
    output_codec_context->time_base = input_codec_context->time_base;
    output_codec_context->time_base.num *= input_codec_context->ticks_per_frame;
}
else {
    output_codec_context->time_base = input_stream->time_base;
}

おそらく を呼び出す必要があることは承知していますがpacket.pts = av_rescale_q(...)、どの time_bases / 値の間で再スケーリングする必要があるかわかりません。

完全なコードはhttp://pastebin.com/CHvrvc3Gで見ることができます。

私の入力/出力 (コード行 189+190) では、次の出力が得られます。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'testvideo.mp4':
  Metadata:
    major_brand     : M4V 
    minor_version   : 1
    compatible_brands: isomiso2avc1mp41M4A M4V mp42
    encoder         : Lavf54.63.100
  Duration: 00:07:15.41, start: 0.000000, bitrate: 1546 kb/s
    Stream #0.0(eng): Video: h264 (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 1416 kb/s, 23.98 fps, 11988 tbn, 47.95 tbc
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, fltp, 127 kb/s
    Metadata:
      creation_time   : 2013-05-09 14:37:22
Output #0, mpegts, to 'mpegtest':
    Stream #0.0: Video: libx264, yuv420p, 1280x720, q=2-31, 1416 kb/s, 90k tbn, 23.98 tbc
    Stream #0.1: Audio: libfaac, 48000 Hz, stereo, 127 kb/s
4

1 に答える 1

3

再スケーリングを行っていない場合、タイムスタンプが台無しになっても不思議ではありません。

マルチプレクサに送信するパケットのタイムスタンプは、ストリーム タイムベース ( AVStream.time_base) にある必要があります。現在の API セマンティクスは、ヘッダーを書き込む前にコーデックタイムベース ( AVStream.codec.time_base) を設定し、次にマルチプレクサがストリーム タイムベースを選択するというものです。設定したコーデック タイムベースを使用する場合と使用しない場合があります。

デマルチプレクサから取得したパケットのタイムスタンプもストリーム タイムベースにあるため、 を呼び出す必要がありますav_rescale_q(pts/dts/duration, input_stream->time_base, output_stream->time_base)

于 2013-06-13T16:57:30.897 に答える