我想創建一個小應用程序,它將保存來自homing的h264流的幀。 我以一個testRTSP程序爲例,在DummySink::afterGettingFrame
函數中做了幾處修改,在ffmpeg庫的幫助下對幀進行解碼。 正如我從frameSize瞭解到的,我的前兩幀是SPS單元,所以我將它們與我的第三幀連接起來,然後將新的大幀發送到ffmpeg解碼器。但那不起作用。 ffmpeg告訴我,我的第一幀對於SPS來說太大了,然後它告訴我沒有幀......我不知道我需要在這裏更改什麼。LIVE555如何使用h264成幀器類爲ffmpeg獲得最終單元
void DummySink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes,
struct timeval presentationTime, unsigned /*durationInMicroseconds*/)
{
u_int8_t start_code[4] = { 0x00, 0x00, 0x00, 0x01 };
int stCodeLen = 4;
if (frameSize == 50)
{
//add start code
memcpy(bufferWithStartCode, start_code, stCodeLen);
shiftPtr += stCodeLen;
memcpy(bufferWithStartCode + shiftPtr, fReceiveBuffer, frameSize);
shiftPtr += frameSize;
}
else if (frameSize == 4)
{
memcpy(bufferWithStartCode + shiftPtr, fReceiveBuffer, frameSize);
shiftPtr += frameSize;
}
else
{
if (shiftPtr == 0)
{
memcpy(bufferWithStartCode, start_code, stCodeLen);
shiftPtr += stCodeLen;
}
memcpy(bufferWithStartCode + shiftPtr, fReceiveBuffer, frameSize);
avpkt.size = frameSize + shiftPtr;
avpkt.data = bufferWithStartCode;
shiftPtr = 0;
if (!avcodec_send_packet(cContext, &avpkt))
{
envir() << "error sending to decoder";
}
if (!avcodec_receive_frame(cContext, picture))
{
envir() << "error rx from decoder";
}
if (picture)
{
FILE *f;
char buffer[32]; // The filename buffer.
snprintf(buffer, sizeof(char) * 32, "file%i.txt", frame_num);
f = fopen(buffer, "w");
fprintf(f, "P5\n%d %d\n%d\n", fSubsession.videoWidth(), fSubsession.videoHeight(), 255);
for (int i = 0;i < fSubsession.videoHeight();i++)
fwrite(picture->data[0] + i * (picture->linesize[0]), 1, fSubsession.videoWidth(), f);
fclose(f);
}
}
envir() << frameSize << "\n";
frame_num++;
// Then continue, to request the next frame of data:
continuePlaying();
SPS和PPS數據是50和4字節大小?也許這是我的前兩個「框架」?我怎麼能在'extradata'中引用兩個不同的變量? – Aleksey
sps和pps的大小不是固定的,因此在刪除的答案中提到您不能根據大小做出任何假設 - 您需要檢查實際的nal類型(NAL單元中第一個字節的最右邊五位)。至於'extradata' - 如果我的記憶是正確的,你只需將它們傳入一個單獨的緩衝區,除以你已經使用的前綴代碼,並相應地設置'extradata_size'。順便說一句,如果你想ffmpeg解碼流,爲什麼不使用ffmpeg(avio_open)進行RTSP處理呢?那麼你不必爲此煩惱,一切都將在內部完成。 –