12

libavcodec を使用してビデオを H264 としてエンコードしようとしています

ffmpeg::avcodec_encode_video(codec,output,size,avframe);

avframe->pts 値が正しく設定されていないというエラーが返されます。
0,1、AV_NOPTS_VALUE、および 90khz * フレーム番号に設定しようとしましたが、それでもエラーが発生しますnon-strictly-monotonic PTS

ffmpeg.c の例では、ffmpeg::av_rescale_q() で packet.pts を設定していますが、これはフレームをエンコードした後にのみ呼び出されます。

MP4V コーデックで使用すると、avcodec_encode_video() 自体が pts 値を正しく設定します。

4

4 に答える 4

8

私は同じ問題を抱えていましたが、次のように avcodec_encode_video を呼び出す前に pts を計算することで解決しました:

//Calculate PTS: (1 / FPS) * sample rate * frame number
//sample rate 90KHz is for h.264 at 30 fps
picture->pts = (1.0 / 30) * 90 * frame_count;
out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture);

この役立つブログ投稿から盗まれたソリューション

(注: サンプル レートを khz に変更しました。hz で表現すると、フレーム間が長すぎました。この値で遊ぶ必要があるかもしれません。ここではビデオ エンコーディングの専門家ではありません。機能するものが欲しかっただけで、これが実行されました)

于 2012-02-24T00:25:22.503 に答える
3

私もこの問題を抱えていました。私はこのように問題を解決しました:

呼び出す前に

ffmpeg::avcodec_encode_video(codec,output,size,avframe);

次のように、avframeのpts値を、初期値が0で、毎回1ずつ増加する整数値に設定します。

avframe->pts = nextPTS();

nextPTS()の実装は次のとおりです。

int nextPTS()
{
    static int static_pts = 0;
    return static_pts ++;
}

avframeのポイントに値を指定した後、それをエンコードします。正常にエンコードされた場合。次のコードを追加します。

    if (packet.pts != AV_NOPTS_VALUE)
        packet.pts = av_rescale_q(packet.pts, mOutputCodecCtxPtr->time_base, mOutputStreamPtr->time_base);
    if (packet.dts != AV_NOPTS_VALUE)
         packet.dts = av_rescale_q(packet.dts, mOutputCodecCtxPtr->time_base, mOutputStreamPtr->time_base);

エンコードされたAVFrameの正しいdts値が追加されます。コードの中で、タイプAVPacketのpacke、タイプAVCodecContext *のmOutputCodeCtxPtr、およびタイプAVStreamのmOutputStreamPtr。

avcodec_encode_videoは0を返し、現在のフレームがバッファリングされていることを示します。すべてのフレームがエンコードされた後、バッファリングされたすべてのフレームをフラッシュする必要があります。このコードは、バッファリングされたすべてのフレームを次のようにフラッシュします。

int ret;
while((ret = ffmpeg::avcodec_encode_video(codec,output,size,NULL)) >0)
    ;// place your code here.
于 2012-10-09T16:56:46.300 に答える
0

私もこの問題を抱えていました。私が覚えている限り、エラーはに関連していますdts

設定

out_video_packet.dts = AV_NOPTS_VALUE;

助けて頂きました

于 2011-07-10T22:42:49.770 に答える
0

厳密に増加する単調関数は、x < y の場合に f(x) < f(y) となる関数です。したがって、同じPTSで2つのフレームをエンコードできないことを意味します...たとえば、カウンターで確認すると、エラーが返されなくなります。

于 2012-02-12T22:48:20.467 に答える