2016-02-17 17 views
6

Tôi đang cố gắng để chuyển đổi h264 và aac được tạo bằng MediaCodec bằng FFMPEG và cũng sử dụng hỗ trợ RTMP của FFMPEG để gửi tới youtube. Tôi đã tạo hai đường ống và đang viết từ java (android) thông qua WriteableByteChannels. Tôi có thể gửi cho một đường ống tốt (chấp nhận âm thanh rỗng) như sau:Làm cách nào tôi có thể chạy dòng lệnh FFMPEG và chấp nhận nhiều đường ống (video và âm thanh) mà không bị chặn trên đầu vào đầu tiên?

./ffmpeg -f lavfi -i aevalsrc=0 -i "files/camera-test.h264" -acodec aac -vcodec copy -bufsize 512k -f flv "rtmp://a.rtmp.youtube.com/live2/XXXX" 

Phát trực tuyến trên YouTube hoạt động hoàn hảo (nhưng tôi không có âm thanh). Sử dụng hai ống này là mệnh lệnh của tôi:

./ffmpeg \ 
-i "files/camera-test.h264" \ 
-i "files/audio-test.aac" \ 
-vcodec copy \ 
-acodec copy \ 
-map 0:v:0 -map 1:a:0 \ 
-f flv "rtmp://a.rtmp.youtube.com/live2/XXXX"" 

Các ống được tạo ra với mkfifo, và mở từ java như thế này:

pipeWriterVideo = Channels.newChannel(new FileOutputStream(outputFileVideo.toString())); 

Trình tự thực hiện (đối với bây giờ trong giai đoạn thử nghiệm của tôi) là sự sáng tạo của các tập tin, bắt đầu ffmpeg (thông qua vỏ adb) và sau đó bắt đầu ghi mở ra các kênh. ffmpeg sẽ ngay lập tức mở luồng h264 và sau đó chờ đợi, vì nó đang đọc từ đường ống, kênh đầu tiên mở (cho video) sẽ chạy thành công. Khi nói đến cố gắng để mở âm thanh theo cùng một cách, nó không thành công vì ffmpeg đã không thực sự bắt đầu đọc từ đường ống. Tôi có thể mở một cửa sổ thiết bị đầu cuối thứ hai và mèo các tập tin âm thanh và ứng dụng của tôi phun ra những gì tôi hy vọng được mã hóa aac, nhưng ffmpeg không thành công, thường chỉ ngồi đó chờ đợi. Đây là kết quả đầu ra dài dòng:

ffmpeg version N-78385-g855d9d2 Copyright (c) 2000-2016 the FFmpeg 
developers 
    built with gcc 4.8 (GCC) 
    configuration: --prefix=/home/dev/svn/android-ffmpeg-with-rtmp/src/ffmpeg/android/arm 
    --enable-shared --disable-static --disable-doc --disable-ffplay 
    --disable-ffprobe --disable-ffserver --disable-symver 
    --cross-prefix=/home/dev/dev/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi- 
    --target-os=linux --arch=arm --enable-cross-compile 
    --enable-librtmp --enable-pic --enable-decoder=h264 
    --sysroot=/home/dev/dev/android-ndk-r10e/platforms/android-19/arch-arm 
    --extra-cflags='-Os -fpic -marm' 
    --extra-ldflags='-L/home/dev/svn/android-ffmpeg-with-rtmp/src/openssl-android/libs/armeabi ' 
    --extra-ldexeflags=-pie --pkg-config=/usr/bin/pkg-config 
    libavutil  55. 17.100/55. 17.100 
    libavcodec  57. 24.102/57. 24.102 
    libavformat 57. 25.100/57. 25.100 
    libavdevice 57. 0.101/57. 0.101 
    libavfilter  6. 31.100/6. 31.100 
    libswscale  4. 0.100/4. 0.100 
    libswresample 2. 0.101/2. 0.101 
matched as AVOption 'debug' with argument 'verbose'. 
Trailing options were found on the commandline. 
Finished splitting the commandline. 
Parsing a group of options: global . 
Applying option async (audio sync method) with argument 1. 
Successfully parsed a group of options. 
Parsing a group of options: input file files/camera-test.h264. 
Successfully parsed a group of options. 
Opening an input file: files/camera-test.h264. 
[file @ 0xb503b100] Setting default whitelist 'file' 

Tôi nghĩ rằng nếu tôi chỉ có thể nhận ffmpeg để bắt đầu nghe cả hai đường ống, phần còn lại sẽ hoạt động!

Cảm ơn thời gian của bạn.

EDIT: Tôi đã thực hiện tiến trình bằng cách tách kết nối và mã hóa đường ống âm thanh, nhưng ngay sau khi luồng video đã được truyền qua lỗi trên âm thanh. Tôi bắt đầu một chủ đề riêng biệt để tạo ra WriteableByteChannel cho âm thanh và nó không bao giờ được thông qua việc tạo ra FileOutputStream.

matched as AVOption 'debug' with argument 'verbose'. 
Trailing options were found on the commandline. 
Finished splitting the commandline. 
Parsing a group of options: global . 
Successfully parsed a group of options. 
Parsing a group of options: input file files/camera-test.h264. 
Successfully parsed a group of options. 
Opening an input file: files/camera-test.h264. 
[file @ 0xb503b100] Setting default whitelist 'file' 
[h264 @ 0xb503c400] Format h264 probed with size=2048 and score=51 
[h264 @ 0xb503c400] Before avformat_find_stream_info() pos: 0 bytes read:15719 seeks:0 
[h264 @ 0xb5027400] Current profile doesn't provide more RBSP data in PPS, skipping 
[h264 @ 0xb503c400] max_analyze_duration 5000000 reached at 5000000 microseconds st:0 
[h264 @ 0xb503c400] After avformat_find_stream_info() pos: 545242 bytes read:546928 seeks:0 frames:127 
Input #0, h264, from 'files/camera-test.h264': 
    Duration: N/A, bitrate: N/A 
    Stream #0:0, 127, 1/1200000: Video: h264 (Baseline), 1 reference frame, yuv420p(left), 854x480 (864x480), 1/50, 25 fps, 25 tbr, 1200k tbn, 50 tbc 
Successfully opened the file. 
Parsing a group of options: input file files/audio-test.aac. 
Applying option vcodec (force video codec ('copy' to copy stream)) with argument copy. 
Successfully parsed a group of options. 
Opening an input file: files/audio-test.aac. 
Unknown decoder 'copy' 
[AVIOContext @ 0xb5054020] Statistics: 546928 bytes read, 0 seeks 

Đây là nơi tôi cố mở ống âm thanh.

new Thread(){ 
    public void run(){ 
      Log.d("Audio", "pre thread"); 
      FileOutputStream fs = null; 
      try { 
       fs = new FileOutputStream("/data/data/android.com.android.grafika/files/audio-test.aac"); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      Log.d("Audio", "made fileoutputstream"); //never hits here 
      mVideoEncoder.pipeWriterAudio = Channels.newChannel(fs); 
      Log.d("Audio", "made it past opening audio pipe"); 
    } 
}.start(); 

Cảm ơn.

+0

bạn có cần ghép cặp '-acodec ... -i tên tệp -vcodec -i filename' không? . Cũng trong đầu ra tiết, bạn có thể quấn dòng cấu hình cho mỗi '--option', rất khó đọc. Chúc may mắn. – shellter

+0

Tôi không nghĩ như vậy, tôi đã nhìn thấy nhiều ví dụ với cờ codec ở cuối. Tôi chỉ thử nó và tôi nhận được cùng một đầu ra. Tôi tự hỏi Nếu tôi cần phải thử streaming các kênh âm thanh và video hoàn toàn độc lập (có thể nếu một dòng video hoạt động là hiện tại trên đường ống đầu tiên nó sẽ tiến hành thứ hai ??). Tôi sẽ cố gắng điều chỉnh mã của tôi cho điều này. – Version135b

+0

Vì bạn chưa có bất kỳ phản hồi thực sự nào, tôi sẽ tìm kiếm các trang web cụ thể hơn đối với xử lý âm thanh hoặc thậm chí là ffmpeg cụ thể. Tôi khá chắc chắn có một diễn đàn ffmpeg "chính thức", nơi bạn có thể nhận được một câu trả lời dứt khoát. Cảm ơn bạn đã chỉnh sửa. Chúc may mắn! – shellter

Trả lời

4

Giải thích của bạn không rõ ràng, tôi có thể thấy bạn đang cố gắng giải thích chính xác những gì bạn đang làm, nhưng nó không hoạt động.

Đầu tiên: bạn có thể mô tả vấn đề thực tế hay không. Tôi phải đọc cho đến nửa chừng bài viết của bạn thành một đoạn 8 dòng và có vẻ như bạn đang đề xuất ffmpeg là treo. Đó có phải là vấn đề không? Bạn thực sự muốn được rõ ràng về điều đó.

Thứ hai: làm thế nào để bạn đưa dữ liệu đường ống vào FIFO? Điều này quan trọng. Bài đăng của bạn hoàn toàn không rõ ràng, bạn dường như đề xuất ffmpeg đọc toàn bộ tệp video và sau đó chuyển sang âm thanh. Đúng không? Hay cả hai luồng được nạp vào ffmpeg đồng thời?

Cuối cùng: nếu ffmpeg bị treo, có thể vì một trong các đường ống đầu vào của bạn đang chặn (bạn đang đẩy dữ liệu vào FIFO-1 và bộ đệm đầy, nhưng ffmpeg muốn dữ liệu từ FIFO-2 và bộ đệm trống) . Cả hai FIFO cần phải luôn được lấp đầy một cách độc lập với dữ liệu.

+0

Cảm ơn phản hồi, xin lỗi vì tôi không rõ. Tôi nghĩ rằng tôi có hai vấn đề, nhưng có lẽ họ có liên quan. 1: Tôi không thể mở âm thanh FIFO, 2: ffmpeg đang trì hoãn xem video FIFO. Quá trình này là (đã được) khởi động ffmpeg với lệnh trên, sau đó mở FIFO để viết (video đầu tiên, sau đó âm thanh) trong ứng dụng. Tôi nghĩ * ffmpeg mong đợi dữ liệu video trong ống trước khi chuyển sang đầu vào thứ hai. Tôi hiện đang làm việc để tách mã bộ mã hóa để tôi có thể ghi video ngay lập tức vào đường ống (tôi sẽ lo lắng về việc đồng bộ hóa sau). Điều đó có làm rõ bất cứ điều gì không? – Version135b

+0

Không thực sự. Bạn vẫn đang nói về FIFO cá nhân như thể bạn đang lấp đầy từng cái một. Bạn không nên. Cả hai FIFO phải luôn được lấp đầy liên tục với dữ liệu, độc lập (ví dụ: thường được tạo luồng hoặc như vậy). –

+0

Lý do tôi nói về chúng một cách độc lập là tôi không thể mở FIFO thứ hai để viết cho đến khi có gì đó đang đọc từ nó. Nếu tôi gõ 'cat files/audio.mp4' vào terminal thứ hai và sau đó bắt đầu mã Android của mình, tôi có thể mở cả hai fileoutputstreams, nhưng nếu không có gì đang nghe (đối với audio) thì nó sẽ không cho phép tôi mở fileoutputstream. Tôi có cần tạo FIFO khác không? PS: Tôi đã chỉnh sửa câu trả lời với một số thông tin mới. – Version135b

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