2012-03-28 116 views
4

我正在試驗視頻,想知道如何從MPEG-TS容器中包含的H264中提取I幀。 我想要做的是從視頻流中生成預覽圖像。 由於I幀應該是來自P幀和B幀的完整圖像,是否有可能僅僅提取圖像的數據而無需使用編解碼器對其進行解碼?從H264在MPEG-TS中從H264中提取I幀

我已經做了一些MPEG-TS容器格式​​的工作,但我並沒有太多專業的編解碼器。

我寧願尋找信息。

非常感謝。

+1

雖然I幀是一個完整的圖片,它仍然是編碼的。解碼它是一項複雜的任務。任何不使用編解碼器的理由? – 2012-03-28 09:41:10

+0

只是想嘗試自己做。你會建議一些圖書館嗎? – gekod 2012-03-28 09:52:20

+0

除非你是一個真正的專業人士,否則不要考慮自己解碼(檢查H264標準*咧嘴*)。 'x264'和'ffmpeg'是一個選項,但我不知道如何強制I幀。 – 2012-03-28 11:23:31

回答

3

我不是這方面的專家,但我相信你的問題的答案是NO。

如果要將I幀保存爲JPEG圖像,仍然需要「轉碼」視頻幀,即首先需要使用H264解碼器解碼I幀,然後使用JPEG編碼器對其進行編碼。這是因爲JPEG編碼器不理解H264幀,它只接受未壓縮的視頻幀作爲輸入。另外,由於JPEG編碼器的輸入是一個未壓縮的幀,所以可以從任何類型的幀(I/P/B)生成一個JPEG圖像,因爲它已經被解碼(使用參考I幀,如果需要)在饋送到編碼器之前。

2

我也不是這個領域的專家。但我已經玩過解碼。如果你想編寫一些代碼,與appsrc/appsink元素取代videorate

gst-launch -v filesrc location=./video.mp4 ! qtdemux name=demux demux.video_00 ! ffdec_h264 ! videorate ! 'video/x-raw-yuv,framerate=1/1' ! jpegenc ! multifilesink location=image-%05d.jpeg 

:使用此GStreamer的管道從video.mp4提取預覽。編寫控制程序管道(見example):

filesrc location=./video.mp4 ! qtdemux name=demux demux.video_00 ! ffdec_h264 ! appsink 
appsrc ! 'video/x-raw-yuv,framerate=1/1' ! jpegenc ! multifilesink location=image-%05d.jpeg 

緩衝器沒有GST_BUFFER_FLAG_DELTA_UNIT標誌設置爲I幀。您可以安全地跳過許多幀,並在任何I幀開始解碼流。