1

私はライフストリームソフトウェアをやろうとしています。私が試しているのは、x264のlibを使用してサーバー側でh264にエンコードし、ffmpegを使用してクライアント側でデコードすることです。直接実行しようとして失敗した後、単純化することにしました。最初に実行しようとしているのは、x264_encoder_encodeを使用してフレームをエンコードし、結果のNALをファイルに書き込むことです。次に、そのファイルが正しいかどうかをテストします。

エンコーダーを初期化するには、次のようにします。

x264_param_t param;
x264_param_default_preset(&param, "veryfast", "zerolatency");
param.i_threads = 1;
param.i_width = a_iWidth;
param.i_height = a_iHeight;
param.i_fps_num = a_iFPS;
param.i_fps_den = 1;
param.i_keyint_max = a_iFPS;
param.b_intra_refresh = 1;
param.rc.i_rc_method = X264_RC_CRF;
param.rc.i_vbv_buffer_size = 1000000;
param.rc.i_vbv_max_bitrate =500;    //For streaming:
param.b_repeat_headers = 1;
param.b_annexb = 1;
x264_param_apply_profile(&param, "baseline");
encoder = x264_encoder_open(&param);

次に、画像(RGBA画像)がある場合、それをYUV420Pに変換してから、x264_encoder_encodeを呼び出します。

int frame_size = x264_encoder_encode(encoder, &nals, &num_nals, picture, &pic_out);
if (frame_size > 0)
{
    m_vNALs.push_back( (char*)nals[0].p_payload );
    m_vSizes.push_back( frame_size );

    return frame_size;
}

すべてが有効であるように見え、frame_sizeはゼロ以外の正の値を返し、他のすべてのパラメーターは正常であるように見えます。すべてのNALは正しいコードで始まります。

だから私はすべてのnalsをファイルに書いています:

FILE* pFile;
pFile = fopen("file.h264", "wb");
for( int nIndex = 0; nIndex < m_vNALs.size(); nIndex++ )
{
    fwrite( m_vNALs[ nIndex ], m_vSizes[ nIndex ], 1, pFile );
}

これでfile.h264ファイルができました。したがって、このファイルをテストするには、ffmpeg.exe(Windowsを使用しています)を使用すると、次の出力が得られます。

[h264 @ 00000000021c5a60] non-existing PPS referenced
[h264 @ 00000000021c5a60] non-existing PPS 0 referenced
[h264 @ 00000000021c5a60] decode_slice_header error
[h264 @ 00000000021c5a60] no frame!
[h264 @ 00000000021c5a60] non-existing PPS referenced
[h264 @ 00000000021b74a0] max_analyze_duration 5000000 reached at 5000000
[h264 @ 00000000021b74a0] decoding for stream 0 failed
[h264 @ 00000000021b74a0] Could not find codec parameters for stream 0 (Video: h
264): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[h264 @ 00000000021b74a0] Estimating duration from bitrate, this may be inaccura
te
file.h264: could not find codec parameters

vlcもファイルを再生できません。

ffplayは言う:

file.h264: Invalid data found when processing input

なにが問題ですか?????

よろしくお願いします、Zetlb

4

2 に答える 2

1

x264_encoder_encodeによって返されるポインタとサイズのみを保存し、実際のデータは保存しないようです。

m_vNALs.push_back( (char*)nals[0].p_payload );
m_vSizes.push_back( frame_size );

このポイントされたデータは、次のx264_encoder_encode/x264_encoder_closeを呼び出す前にのみ有効です。

于 2013-01-24T15:08:48.417 に答える
1

h.264ファイルのヘッダーをh.264ファイルに書き込むのを忘れたようです。

于 2013-05-17T03:09:30.123 に答える