2011-02-24 31 views
13

gì tôi muốn làFFmpeg Làm thế nào để viết đoạn video vào một tập tin

1. Get video packet from stream source 
2. Decode it 
3. And write that decoded data as video file(avi, mpeg etc) 

tôi có thể có thể nhận được gói video từ một tập tin (như AVPacket) và cũng có thể giải mã và lưu dưới dạng ảnh. (Thô) (Hướng dẫn FFmpeg hiển thị cách thực hiện). Nhưng tôi không thể (không biết) ghi dữ liệu video đó vào một tệp (khác) có thể được phát bởi trình phát đa phương tiện (chẳng hạn như VLC).

nhất Wishes

Ps: mẫu Bất mã sẽ là tuyệt vời nếu có thể ...

Bây giờ tôi thực hiện thử nghiệm với av_interleaved_write nhưng tôi đã nhận lỗi lạ "timestamps không đơn điệu" (tôi không có kiểm soát qua điểm giá trị của nguồn phương tiện truyền thông)

Một số phụ Info

trong FFmpeg tôi phải

  1. Đọc các gói phương tiện từ nguồn phương tiện (có thể là tệp thực (.avi, mov) hoặc thậm chí máy chủ rtsp).
  2. Sau đó viết những gói tin phương tiện truyền thông vào một tập tin thực (.avi vật lý, .mov file etc)

Tôi cần người đọc và nhà văn. Tôi có thể đọc các tập tin nguồn phương tiện truyền thông (thậm chí mã hóa các gói tin theo định dạng nhất định). Nhưng tôi không thể ghi ra tập tin ... (mà bất kỳ người chơi có thể chơi)

Và một số giả

File myFile("MyTestFile.avi"); 

while (source ->hasVideoPackets) 
{ 
    packet = source->GetNextVideoPacket(); 
    Frame decodedFrame = Decode(packet); 
    VideoPacket encodedPacket = Encode(decodedFrame); 
    myFile.WriteFile(encodedPacket); 
} 

Hoặc Chỉ cần viết các tập tin ban đầu mà không cần mã hóa giải mã

 File myFile("MyTestFile.avi"); 

    while (source ->hasVideoPackets) 
    { 
     packet = source->GetNextVideoPacket(); 
     myFile.WriteFile(packet); 
    } 

Sau đó

I can able to open MyTest.avi file with a player. 
+0

Giải thưởng tiền thưởng cho người cung cấp liên kết đến một ví dụ điển hình thực hiện điều này. sử dụng av_interleaved_write_frame hoặc av_write_frame –

+0

kiểm tra liên kết này minh họa tệp video bằng cách sử dụng FFMPEG libs: https://stackoverflow.com/a/43464269/6180077 –

Trả lời

0

Tôi đã làm điều gì đó như thế này tại một số điểm sử dụng libx264 và vorbis.

Ví dụ về mã. https://github.com/Themaister/SSNES/blob/master/record/ffemu.c

Ý tưởng cơ bản là bạn phải tự đặt dấu thời gian ở AVFrame khi bạn muốn mã hóa nó. Sau đó, bạn có thể lấy gói đó và viết nó với av_interleaved_write().

+0

Ok. Tôi sẽ kiểm tra. cảm ơn về câu trả lời. – NoviceAndNovice

+0

Vâng, tôi không thể tìm ra cách để nói "av_interleaved_write_frame" chức năng ghi các gói tin mà tập tin vật lý (chẳng hạn như đọc các gói tin và ghi vào "mytest.avi" tập tin. – NoviceAndNovice

+0

Vâng tôi tìm ra. Ctx-> oformat = av_guess_format (NULL, ctx-> filename, NULL) Nhưng vì tôi có một tệp nguồn và tệp đích, nên tôi phải tạo 2 AVFormatContext: một để đọc và một để viết? – NoviceAndNovice

0

bạn cần phải viết một bộ mã hóa để chuyển đổi dữ liệu thô để yêu cầu định dạng video

ffmpeg encoding sample wanted?

Encode audio to aac with libavcodec

+0

Tôi có thể mã hóa và giải mã dữ liệu bằng cách sử dụng thư viện ffmpeg (không phải cli , tôi sử dụng api) Những gì tôi không thể làm là ghi vào tập tin thực tế bằng cách sử dụng chức năng av_interleaved_write để bất kỳ người chơi nào có thể chơi nó (chắc chắn người chơi có các codec cần thiết) – NoviceAndNovice

4

Có lẽ liên kết này có thể giúp bạn:

Output a media file in any supported libavformat format

Tôi hy vọng điều đó sẽ hữu ích.

+0

Ví dụ này sử dụng 'av_interleaved_write_frame' – bacchus

+0

Ví dụ trên tạo ra một video giả Những gì Câu hỏi này yêu cầu là một ví dụ để giải mã và mã hóa video. Vấn đề ở đây là với việc sử dụng thực tế của avcodec_ecode_video và avcodec_decode_video là kết quả sử dụng không đúng trong các lỗi phân đoạn khác nhau và bộ đệm dưới. Tôi đã đi tất cả các ví dụ mặc định được đưa ra. Dường như với tôi rằng một ví dụ tốt có thể sẽ cắt bỏ điều này từ ffmpeg.c –

+0

@AdityaGameProgrammer Bạn không thể kết hợp mã liên kết ở trên với [one] này (http://www.inb.uni-luebeck.de/~ boehme/using_libavcodec.html) chỉ để có những gì bạn muốn? Phần trên giải thích cách viết khung, một khung trong nhận xét này để đọc và giải mã. Nếu bạn kết hợp cả hai bạn có thể có hiệu ứng mong muốn. – bacchus

Các vấn đề liên quan