我正在試驗視頻,想知道如何從MPEG-TS容器中包含的H264中提取I幀。 我想要做的是從視頻流中生成預覽圖像。 由於I幀應該是來自P幀和B幀的完整圖像,是否有可能僅僅提取圖像的數據而無需使用編解碼器對其進行解碼?從H264在MPEG-TS中從H264中提取I幀
我已經做了一些MPEG-TS容器格式的工作,但我並沒有太多專業的編解碼器。
我寧願尋找信息。
非常感謝。
我正在試驗視頻,想知道如何從MPEG-TS容器中包含的H264中提取I幀。 我想要做的是從視頻流中生成預覽圖像。 由於I幀應該是來自P幀和B幀的完整圖像,是否有可能僅僅提取圖像的數據而無需使用編解碼器對其進行解碼?從H264在MPEG-TS中從H264中提取I幀
我已經做了一些MPEG-TS容器格式的工作,但我並沒有太多專業的編解碼器。
我寧願尋找信息。
非常感謝。
我不是這方面的專家,但我相信你的問題的答案是NO。
如果要將I幀保存爲JPEG圖像,仍然需要「轉碼」視頻幀,即首先需要使用H264解碼器解碼I幀,然後使用JPEG編碼器對其進行編碼。這是因爲JPEG編碼器不理解H264幀,它只接受未壓縮的視頻幀作爲輸入。另外,由於JPEG編碼器的輸入是一個未壓縮的幀,所以可以從任何類型的幀(I/P/B)生成一個JPEG圖像,因爲它已經被解碼(使用參考I幀,如果需要)在饋送到編碼器之前。
我也不是這個領域的專家。但我已經玩過解碼。如果你想編寫一些代碼,與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幀開始解碼流。
正如其他人已經注意到解碼h.264是複雜的。你可以編寫你自己的解碼器,但這是一項重大的努力。爲什麼不使用現有的解碼器?
英特爾IPP庫中有一個解碼器和一個樣品decoer的基本構建塊:
Code Samples for the Intel® Integrated Performance Primitives
還有的libavcodec:
雖然I幀是一個完整的圖片,它仍然是編碼的。解碼它是一項複雜的任務。任何不使用編解碼器的理由? – 2012-03-28 09:41:10
只是想嘗試自己做。你會建議一些圖書館嗎? – gekod 2012-03-28 09:52:20
除非你是一個真正的專業人士,否則不要考慮自己解碼(檢查H264標準*咧嘴*)。 'x264'和'ffmpeg'是一個選項,但我不知道如何強制I幀。 – 2012-03-28 11:23:31